雄辩的JavaScript,第2版,练习5.3历史人生预期

时间:2015-02-03 06:22:14

标签: javascript arrays javascript-objects

这个问题要求我们采取一系列对象(每个对象包含一个人的信息),将这些人分组到他们去世的那个世纪,然后产生一个人每个世纪的平均年龄。

我已经查看了教科书解决方案,但我无法理解为什么我的解决方案也不起作用。

我能够为每个世纪生成一个由数组组成的对象,每个数组中的元素都是我需要平均的年龄:

{16: [47, 40],
 17: [40, 66, 45, 42, 63],
 18: [41, 34, 28, 51, 67, 63, 45, 6, 43, 68, …],
 19: [72, 45, 33, 65, 41, 73],
 20: [73, 80, 90, 91, 92, 82],
 21: [94]}

他们为我们提供了一个平均功能:

function average(array) {
  function plus(a, b) { return a + b; }
  return array.reduce(plus) / array.length;
}

然后我运行这段代码:

var obj = group(ancestry); //this is the object of arrays from above
for (var century in obj) {
  console.log(century + ": " + average(century));
}

我应该得到这个:

// → 16: 43.5
//   17: 51.2
//   18: 52.8
//   19: 54.8
//   20: 84.7
//   21: 94

相反,我得到了这个错误:

TypeError: undefined is not a function (line 3 in function average) 
 called from line 26
//where line 3 is the third line in the average function
//and line 26 is the "console.log..." line from the last paragraph of code

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

编辑:哦,之前我没有注意到,但是您正在使用for..in循环,然后操作密钥而不是值。

使你的循环如此:

for (var century in obj) {
  console.log(century + ": " + average(obj[century]));
}

阅读Array.prototype.reduce功能。 reduce函数需要第一个参数作为回调 - 一个操作的函数,并返回一个可变对象(对象或数组)。

来自MDN链接本身:

  

reduce对数组中的每个元素执行一次回调函数,排除数组中的空洞,接收四个参数:初始值(或前一个回调调用的值),当前元素的值,当前索引,以及正在进行迭代的数组。