【问题标题】:Functional Javascript example of higher-order functions using plucker, reduce and finder functions使用 plucker、reduce 和 finder 函数的高阶函数的函数式 Javascript 示例
【发布时间】:2014-03-21 00:05:57
【问题描述】:

我正在阅读 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-function:

var people = [{name: "Fred", age: 65}, {name: "Lucy", age: 36}];

**finder(plucker('age'), Math.max, people);**

其中plucker函数定义为:

function plucker(field){
    return function(obj){
        return (obj && obj[field]);
    }
}

(plucker 应该返回一个键的值)

我正在逐行浏览代码,但是当我遇到 finder-function 定义中的 reduce-function 时,我很吃力。我不明白的是

valueFun(best)

和 valueFun(当前)

通过 reduce 函数的每次迭代,best 和 current 的值分别是多少?我的理解是 valueFun 是 plucker 函数。但是他已经给 plucker 提供了“年龄”这个参数,那么最好和当前代表什么?

如果您要回答这个问题,如果您概述了如何得出您的答案,我将非常感激,以便我看到逐步通过 finder 函数的值。谢谢!

【问题讨论】:

    标签: javascript functional-programming underscore.js reduce higher-order-functions


    【解决方案1】:

    新的 JavaScript 编码人员苦苦挣扎的一件事是函数被传递的频率,既作为其他函数的参数,也作为其他函数的返回值。

    我的理解是valueFun就是plucker函数。

    不完全是。当他调用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 是 Math.max 函数,它只返回两个数字中较大的一个。在_.reduce 函数的每次迭代中,他将当前对象的age 值与现有的最高值进行比较,并返回两者中的较大值。

    如果那本书没有涉及到,您需要阅读 JavaScript 中的闭包,因为这与本示例极为相关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 2021-05-25
      相关资源
      最近更新 更多