我是JavaScript的新手,我一直在通过Eloquent JavaScript(第二版)练习来了解更多信息。一个特别的练习(5.3)给了我很多麻烦。
练习的目的是获取一系列对象,其中包含各种人的死亡日期,并根据死亡日期将其按世纪分组。这就是我到目前为止所做的:
function groupBy(array, groupOf) {
var groups = {};
array.forEach(function(element) {
var groupName = groupOf(element);
if (groupName in groups)
groups[groupName].push(element);
else
groups[groupName] = element;
});
return groups;
}
var byCentury = groupBy(ancestry, function(person) {
return Math.ceil(person.died / 100);
});
我认为问题可以缩小到这一行:groups[groupName] = element;
但我不明白为什么这是错误的。
感谢您的帮助。如果这很明显,我会事先道歉。
答案 0 :(得分:2)
您需要在此行中创建一个数组
groups[groupName] = element;
而你只是分配对象。由于对象没有push
方法,因此您的代码失败。你可以像这样创建一个数组
groups[groupName] = [element];
此外,您可以使用简写表示法来编写if..else
条件,例如
groups[groupName] = groups[groupName] || [];
groups[groupName].push(element);
或者,你可以简单地写一个if
条件,就像这样
if (groupName in groups === false) {
groups[groupName] = [];
}
groups[groupName].push(element);
如果if
中不存在groups[groupName] || []
,则groups[groupName]
条件和groupName
都会确保groups
有一个空数组。
groups[groupName] = groups[groupName] || [];
如果在groups[groupName]
中找不到undefined
,则groupName
将被评估为groups
,这实际上是假的。由于第一个表达式是假的,第二个表达式[]
将是右侧的结果。因此,如果groupName
不存在,则会将一个空数组分配给groups[groupName]
。