请解释代码,并详细说明代码背后的内容。
我对if(! acc[key])
部分感到困惑。这是否意味着如果key不位于acc中并使用值数组设置密钥并跳出if语句并将obj推入acc键值?
如果密钥在acc中,则跳过if语句,并使用另一个内存acc[key]
并设置在acc中的密钥,并用obj设置值。
我的解释正确吗?
var people = [{
name: 'Alice',
age: 21
},
{
name: 'Max',
age: 20
},
{
name: 'Jane',
age: 20
}
];
function groupBy(objectArray, property) {
return objectArray.reduce(function(acc, obj) {
var key = obj[property];
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(obj)
return acc;
}, {});
}
var groupedPeople = groupBy(people, 'age')
console.log(JSON.stringify(groupedPeople))
答案 0 :(得分:1)
if (!acc[key]) {...}
只是在检查您是否已经在累加器中捕获了该键的任何数据。如果那里什么都没有,您可以在acc[key] = [];
处放置一个空数组,以便在下一步中将数据压入其中。
代码中的错误是您还在if子句中包含了push
;这意味着您将仅获得给定键的每个值的第一个对象。相反,您需要 all 该键的每个值的对象。
这是一个修复程序,代码中包含一些注释,解释了每个步骤的作用:
var people = [{
name: 'Alice',
age: 21
},
{
name: 'Max',
age: 20
},
{
name: 'Jane',
age: 20
}
];
function groupBy(objectArray, property) {
return objectArray.reduce(function(acc, obj) {
// stepping through each object in the array:
var key = obj[property]; // "key" is the value of the given property
// for this object
if (!acc[key]) { // if the accumulator doesn't already have
// data for that key,
acc[key] = []; // put an empty array there, so we can add
// data to it
}
// this next line was moved out of the if clause above it, because
// you always want it to happen:
acc[key].push(obj) // push this object onto the accumulator
// at that key
return acc;
}, {});
}
var groupedPeople = groupBy(people, 'age')
console.log(JSON.stringify(groupedPeople))