#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"))