我将一个对象数组简化为一个单独的对象,看起来应该是这样的:
`
result = {
23 : [{obj of kyle}, {obj of jade}],
29 : [{obj of ruby}]
32 : [{obj of mat}]
}
`
我使用了reduce来实现这一点,每个person变量都会引用数组中的一个对象来进行reduce,它们都折叠成一个用变量组引用的对象,该对象的初始值是一个空对象{},所以通过if语句,我首先检查它是否为空,然后创建一个以新的空数组为值的名为age的关键字,并将person对象推送到该空数组中,如果关键字age存在,则跳过新数组的创建并将相应的person对象推入相应的数组中。
这个代码出了什么问题?
`
const people = [
{name: "kyle", age: 23},
{name: "jade", age: 23},
{name: "ruby", age: 29},
{name: "mat", age: 32}
]
let result = people.reduce(function(person, group){
const age = person.age;
if(group[age]==null){
group[age] = []
}
group[age].push(person);
return group
},{})
console.log(result);
`
不是我所期望的
再次查看您的代码,您似乎可以通过在reduce
中替换回调函数中的person
和group
来修复自己的代码,就像一样
const people = [
{name: "kyle", age: 23},
{name: "jade", age: 23},
{name: "ruby", age: 29},
{name: "mat", age: 32}
]
let result = people.reduce(function(group, person){
const age = person.age;
if(group[age]==null){
group[age] = []
}
group[age].push(person);
return group
},{})
console.log(result);
你也可以这样做
const people = [
{name: "kyle", age: 23},
{name: "jade", age: 23},
{name: "ruby", age: 29},
{name: "mat", age: 32}
];
const result = people.reduce((acc, curr) => {
if (!acc[curr.age]) {
return {...acc, [curr.age]: [curr]}
}
return {...acc, [curr.age]: [...acc[curr.age], curr]};
}, {});
console.log(result);
我们在这里所做的是像您所做的那样用一个新对象初始化它,然后对于数组中的每个元素,表示为当前的curr
,我们检查我们的新对象(表示为累加器的acc
)是否有一个年龄已经为curr.age
的密钥。如果不是,我们为这个年龄制作一个数组,并将当前元素放在里面。否则,如果这个年龄键已经存在,只需将当前元素添加到该年龄数组中即可。