高阶函数中的Javascript对象克隆

时间:2014-10-18 05:23:43

标签: javascript arrays object

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

感谢您的帮助。如果这很明显,我会事先道歉。

1 个答案:

答案 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]