用过滤器卷曲

时间:2018-05-12 18:49:01

标签: javascript currying

let dragons = [
    { name: "Test1", power: "Fire" },
    { name: "Test2", power: "Lightning" },
    { name: "Test3", power: "Fire" },
    { name: "Test4", power: "Fire" },
    { name: "Test5", power: "Speed" },
    { name: "Test6", power: "Fly" }
];

let hasPower = power =>
    obj => 
        obj.power === power

let fireDragons = dragons.filter(hasPower("Fire"));

我得到了currying部分,但我不知道的是curry函数是如何通过过滤器传递给obj的,有人能解释一下吗?

1 个答案:

答案 0 :(得分:2)

在理解您分享的代码之前,让我们先了解过滤器功能的语法。

var newArray = arr.filter(callback(currentValue[, index[, array]])[, thisArg])
  

回调函数是一个谓词,用于测试数组的每个元素。返回true以保留元素,否则返回false,取三个参数:elementindexarray本身。 thisArg是可选的。

现在,让我们尝试理解代码。

let hasPower = power =>
    obj => 
        obj.power === power

函数hasPower可以更新为:

let hasPower = function (power) {
    return function (obj) {
        return obj.power === power;
    }
}

请记住,只要执行hasPower,它就会返回一个函数(稍后会执行),并且可以访问power变量。 (阅读更多:Closure

现在是fireDragons,

let fireDragons = dragons.filter(hasPower("Fire"));

您正在将函数作为参数传递给过滤器函数(同时调用)。

执行此行代码时,将首先执行函数hasPower("Fire"),并且从该函数返回的任何内容都将作为callback函数传递给过滤器。

基本上,它会变成:

let fireDragons = dragons.filter(function (obj) {
    // Having access to the `hasPower` variable which is "Fire" in your case.
    return obj.power === power;
});

或者完全像这样: enter image description here

始终尝试在开发人员工具中进行调试,以了解代码的工作原理,并随意将箭头函数替换为常规函数,以使其更具可读性/可理解性。