Сокращение массива без предоставления всех данных

#javascript

Вопрос:

 let inputArr = [{
    "gender": "MALE",
    "name": "A",
    "age": 20
  },
  {
    "gender": "MALE",
    "name": "B",
    "age": 12
  },
  {
    "gender": "FEMALE",
    "name": "C",
    "age": 16
  },
  {
    "gender": "MALE",
    "name": "D",
    "age": 21
  },
  {
    "gender": "FEMALE",
    "name": "E",
    "age": 30
  }
]
console.log(JSON.stringify(inputArr.reduce((acc, ele) => {

  if (acc[ele["gender"]]) {
    acc[ele.gender].members.push(ele);
  } else {

    acc[ele["gender"]] = {
      members: []
    }
  }
  return acc;
}, {}))) 

Я пытаюсь сгруппировать пользователей по признаку пола ,используя Array.reduce ,но на выходе отображаются не все записи, которые включены в массив, я не могу понять суть здесь

Комментарии:

1. В разделе else вы создаете ключ значение, но ничего не добавляете. Таким образом, вы всегда опускаете первое значение, которое будет иметь новый ключ.

2. acc[ele["gender"]] = { members: [ele] };

3. спасибо @VLAZ . Теперь у меня все получилось

Ответ №1:

Ваш редуктор не нажимает на элемент, когда он впервые сталкивается с полом, поэтому в вашем результате отсутствует первый пользователь каждого пола

 let inputArr = [{"gender": "MALE","name": "A","age": 20},{"gender": "MALE","name": "B","age": 12},{"gender": "FEMALE","name": "C","age": 16},{"gender": "MALE","name": "D","age": 21},{"gender": "FEMALE","name": "E","age": 30}]

console.log(JSON.stringify(inputArr.reduce((acc, ele) => {

  if (acc[ele["gender"]]) {
    acc[ele.gender].members.push(ele);
  } else {

    acc[ele["gender"]] = {
      members: [ele] // initialise the array with the current user
    }
  }
  return acc;
}, {}))) 

Ответ №2:

Другое решение, но я не рекомендую его, если важна производительность.

 let inputArr = [{
    "gender": "MALE",
    "name": "A",
    "age": 20
  },
  {
    "gender": "MALE",
    "name": "B",
    "age": 12
  },
  {
    "gender": "FEMALE",
    "name": "C",
    "age": 16
  },
  {
    "gender": "MALE",
    "name": "D",
    "age": 21
  },
  {
    "gender": "FEMALE",
    "name": "E",
    "age": 30
  }
]

function groupBy(array, field) {
  return array.reduce((acc, item) => ({
    ...acc,
    [item[field]]: [...acc[item[field]] || [], item]
  }), {})
}

console.log(groupBy(inputArr, "gender"))