我对 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;
但我不明白为什么这是错误的。
感谢您的帮助。如果这是显而易见的,我提前道歉。
最佳答案
您需要在这一行中创建一个数组
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]
.
关于高阶函数中的 Javascript 对象克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436590/