试图解决"历史人生预期"问题http://eloquentjavascript.net/05_higher_order.html。
来自http://eloquentjavascript.net/code/#5.3的解决方案如下:
function average(array) {
function plus(a, b) { return a + b; }
return array.reduce(plus) / array.length;
}
function groupBy(array, groupOf) {
var groups = {};
array.forEach(function(element) {
if (groupOf(element) in groups)
groups[groupOf(element)].push(element);
else
groups[groupOf(element)] = [element];
});
return groups;
}
var byCentury = groupBy(ancestry, function(person) {
return Math.ceil(person.died / 100);
});
for (var century in byCentury) {
var ages = byCentury[century].map(function(person) {
return person.died - person.born;
});
console.log(century + ": " + average(ages));
}
// → 16: 43.5
// 17: 51.2
// 18: 52.8
// 19: 54.8
// 20: 84.7
// 21: 94
我的问题是围绕groupOf(元素)。 这里发生了什么?"元素"取值16,17,18,19,20或21(作为函数(人)的结果{return Math.ceil(person.died / 100);})。 a)groupOf(element)是什么样的? groupOf从未定义过。 b)在我看来,我可以用元素替换groupOf(元素),但这不是真的......有人可以帮助我理解我不理解的东西吗?感谢。
答案 0 :(得分:0)
如果仔细查看代码中的此代码段
var byCentury = groupBy(ancestry, function(person) { // element = function(person) {return Math.ceil(person.died / 100);}
return Math.ceil(person.died / 100);
});
groupOf只是这个函数,它作为第二个参数传递给groupBy
function(person) { // element = function(person) {return Math.ceil(person.died / 100);}
return Math.ceil(person.died / 100);
}
因为函数只是javascript中的对象,所以你也可以将它们传递给其他函数。
答案 1 :(得分:0)
groupOf 是定义的。它是var byCentury = groupBy(ancestry, /* function goes here */);
由于所有括号,有点难以看清。它和做的一样:
var myFunctionAsAParameter = function(person) {
return Math.ceil(person.died / 100);
}
则...
var byCentury = groupBy(ancestry, myFunctionAsAParameter);
myFunctionAsAParameter
在JavaScript看到()
时才会执行,您会看到:groups[groupOf(element)].push(element);
所以在这种情况下,它会被执行几次,每次都与不同的人(由foreach循环确定)。
缠绕你的头脑有点困难,但它非常强大。函数可以将其他函数作为参数。它们只会在您添加()时执行。如果需要,函数也可以返回其他函数。现在要真的伤到你的头脑。函数甚至可以作为参数返回并接受它们(称为递归)。