函数式Javascript的高阶函数示例,使用了采摘器、减少器和查找器函数



我正在阅读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中的闭包,因为它与这个例子非常相关。

最新更新