我正在阅读Michael Fogus的《Functional Javascript》一书。在第4章中,他创建了一个名为finder的函数,它使用了reduce。我很难掌握这个函数的实现…
function finder(valueFun, bestFun, coll){
return _.reduce(coll, function(best, current){
var bestValue = valueFun(best);
var currentValue = valueFun(current);
return (bestValue === bestFun(bestValue, currentValue)) ? best : current;
});
}
(注意他在书中使用了Underscore.js库)
无论如何,他在下面的例子中使用了finder函数:
var people = [{name: "Fred", age: 65}, {name: "Lucy", age: 36}];
**finder(plucker('age'), Math.max, people);**
其中拔毛器函数定义为:
function plucker(field){
return function(obj){
return (obj && obj[field]);
}
}
(picker应该返回一个键的值)
我正在逐行浏览代码,但是当我在查找函数定义中遇到reduce-function w/时,我很挣扎。我不明白的是
valueFun(best)
和valueFun(当前)
每次通过reduce-function迭代时,best和current的值分别是多少?我的理解是valueFun是拔毛函数。但是他给了采摘者"年龄"这个词,那么最佳和当前代表什么呢?
如果你在回答这个问题,如果你能概述一下你是如何得到你的答案的,我将非常感激,这样我就能一步一步地看到finder函数的值。谢谢!
新JavaScript编码人员纠结的一件事是函数被传递的频率,既作为其他函数的参数,也作为其他函数的返回值。
我的理解是valueFun是拔毛器函数
不完全是。当他调用finder(plucker('age'), Math.max, people);
时,finder
的第一个参数是plucker('age')
的结果。实际上,这是函数function(obj){ return (obj && obj['age']);}
为了更明确一点,我们可以这样做:
var ageGetter = plucker('age');
finder(ageGetter, Math.max, people);
所以本质上plucker('age')
(valueFun)只是一个返回对象的age
属性的函数。bestFun
是数学。Max函数,它只返回两个数字中较大的那个。在_.reduce
函数的每次迭代中,他将当前对象的age
值与现有的最大值进行比较,并返回两者中较大的值。
如果这本书中没有涉及到,你会想要阅读JavaScript中的闭包,因为它与这个例子非常相关。