Eloquent JavaScript,第 2 版,练习 5.3 历史预期寿命
Eloquent JavaScript, 2nd Edition, Exercise 5.3 Historical Life Expectancy
这个问题要求我们获取一组对象(每个对象都包含一个人的信息),按照他们死于哪个世纪对这些人进行分组,然后得出一个人在每个世纪活到的平均年龄。
我看过教科书的解决方案,但我不明白为什么我的解决方案不起作用。
我可以生成一个由每个世纪的数组组成的对象,每个数组中的元素是我需要平均的年龄:
{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
非常感谢任何帮助!
EDIT: 哦,我之前没注意到,但是你使用的是for..in循环,然后对键而不是值进行操作.
这样制作你的循环:
for (var century in obj) {
console.log(century + ": " + average(obj[century]));
}
阅读 Array.prototype.reduce 函数。 reduce 函数期望回调作为第一个参数 - 一个对其进行操作的函数,returns 一个可变对象(对象或数组)。
来自 MDN link 本身:
reduce executes the callback function once for each element present in the array, excluding holes in the array, receiving four arguments: the initial value (or value from the previous callback call), the value of the current element, the current index, and the array over which iteration is occurring.
这个问题要求我们获取一组对象(每个对象都包含一个人的信息),按照他们死于哪个世纪对这些人进行分组,然后得出一个人在每个世纪活到的平均年龄。
我看过教科书的解决方案,但我不明白为什么我的解决方案不起作用。
我可以生成一个由每个世纪的数组组成的对象,每个数组中的元素是我需要平均的年龄:
{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
非常感谢任何帮助!
EDIT: 哦,我之前没注意到,但是你使用的是for..in循环,然后对键而不是值进行操作.
这样制作你的循环:
for (var century in obj) {
console.log(century + ": " + average(obj[century]));
}
阅读 Array.prototype.reduce 函数。 reduce 函数期望回调作为第一个参数 - 一个对其进行操作的函数,returns 一个可变对象(对象或数组)。
来自 MDN link 本身:
reduce executes the callback function once for each element present in the array, excluding holes in the array, receiving four arguments: the initial value (or value from the previous callback call), the value of the current element, the current index, and the array over which iteration is occurring.