我正在尝试理解reduce,我对此挠头,为什么这段代码没有给出预期的结果



我将一个对象数组简化为一个单独的对象,看起来应该是这样的:

`

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中替换回调函数中的persongroup来修复自己的代码,就像一样

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的密钥。如果不是,我们为这个年龄制作一个数组,并将当前元素放在里面。否则,如果这个年龄键已经存在,只需将当前元素添加到该年龄数组中即可。

最新更新