我想使用数组reduce来通过键对数组中的项进行分组。
当我使用下面的groupByIDErr
函数时,我得到obj[item[key]] is not iterable
所以为了让它正常工作,我使用了groupByID
函数,它具有未定义的检查,如下所示。
数组减少有更好的方法来处理吗?我在这里所做的工作对于我提供的示例是可行的,但是当我必须减少更复杂的数组时,我发现更难维护。
function groupByIDErr(arr,key){
return arr.reduce((obj, item) => {
return {
...obj,
[item[key]]: [
...obj[item[key]],
item
]
}
}, {})
}
function groupByID(arr,key){
return arr.reduce((obj, item) => {
return {
...obj,
[item[key]]: obj[item[key]] !== undefined ? [
...obj[item[key]],
item
]:[item]
}
}, {})
}
const people = [
{gender:'male', name: 'Tom'},
{gender:'male', name: 'Richard'},
{gender:'male', name: 'Harry'},
{gender:'female', name: 'Sarah'},
{gender:'female', name: 'Kate'}
]
console.log(groupByID(people,'gender'))
答案 0 :(得分:1)
如果obj[item[key]] || []
为obj[item[key]]
(因为undefined
是假的),您可以使用undefined
使其使用空数组。
function groupByID(arr, key) {
return arr.reduce((obj, item) => {
return {
...obj,
[item[key]]: [
...obj[item[key]] || [],
item
]
};
}, {});
}
const people = [
{ gender: 'male', name: 'Tom' },
{ gender: 'male', name: 'Richard' },
{ gender: 'male', name: 'Harry' },
{ gender: 'female', name: 'Sarah' },
{ gender: 'female', name: 'Kate' }
];
console.log(groupByID(people, 'gender'));

.as-console-wrapper { min-height: 100%; }

答案 1 :(得分:0)
您需要一个递归函数来首先遍历数组的深度,然后返回对象值。
function recurCheck(你的数组,密钥){ //如果数组在数组内 recurCheck(newArray,密钥) //其他 在这里添加你的reduce函数并返回 }