我对以下代码行的含义感到困惑:
if(!acc[key])
这是我对这行的解释:
如果key
不在acc
中,则用值数组设置key
并跳出if语句。然后按obj
键值中的acc
。
如果key
位于acc
中,请跳过if语句并使用另一个内存acc[key]
并设置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 :(得分:3)
方括号[]
用于dynamic property notation(也称为计算属性名称)。就像这样:
var obj = { foo: "bar" };
var propertyWeWant = "foo"; //We want to get obj.foo - the value "bar"
console.log(obj.propertyWeWant); //Returns undefined
console.log(obj[propertyWeWant]); //Returns bar
函数groupBy
接受一组人员,然后返回通过传递的属性 分组的人员(在本例中为age
):
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))
答案 1 :(得分:1)
!acc[key]
意味着如果对象false
中不存在属性key
(它是动态的,就像@Jack Bashford所说的那样),它将返回acc
。
reduce
将起作用
acc
和{}一起初始化key
='21',但是acc['21']
是undefined
,运行if
的块代码!acc[key]
返回true〜>设置acc['20'] = obj
acc['20']
在第3步中具有值〜>跳过块代码并返回acc
acc
结果从20开始的原因是我认为浏览器要打印按字母排序的对象的属性。