2014-10-18 60 views
2

我是JavaScript新手,我一直在通过Eloquent JavaScript(2nd)练习来了解更多信息。一个特别的练习(5.3)给了我很多麻烦。JavaScript对象克隆在高阶函数中

这个练习的目标是将一组包含死亡日期的对象作为一组对象,并按照死亡日期的世纪将它们分组。这是我到目前为止有:

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;,但我不明白为什么这是错的。

感谢您的帮助。如果这是显而易见的,我很抱歉。

回答

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] || []可以确保,如果groupName不存在于groups中,则210具有空数组。

groups[groupName] = groups[groupName] || []; 

这里,groups[groupName]将进行评估,以undefined如果groupNamegroups发现,这其实是falsy。由于第一个表达式是虚假的,因此第二个表达式[]将是右侧的结果。所以,如果groupName不存在,那么一个空数组将被分配给groups[groupName]