javascript - 用过滤器进行 curry

标签 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)部分,但我不明白的是柯里化(Currying)函数如何从过滤器传递 obj,有人可以向我解释一下吗?

最佳答案

在理解您分享的代码之前,我们先来了解一下过滤函数的语法。

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

callback Function is a predicate, to test each element of the array. Return true to keep the element, false otherwise, taking three arguments: element, index and the array itself. thisArg is optional, though.

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

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

函数hasPower可以更新为:

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

请记住,每当执行 hasPower 时,它只会返回一个函数(稍后执行),并且可以访问 power 变量。 (了解更多:Closure)

现在是火龙队,

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

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

关于javascript - 用过滤器进行 curry ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50309634/

相关文章:

javascript - 如何在 onsubmit post 方法表单后显示 thankyou

javascript - Cordova:在浏览器中测试警报插件?

javascript - 处理 JavaScript 中的 Null

javascript 获取日期选择器属性的开始或结束值

scala - 如何在scala中使用带有 curry 函数的命名参数

javascript - 如何在状态更改时强制重新加载react-recaptcha(语言更新)

javascript - 如何在柯里化(Currying)函数中将 Array.prototype 方法作为参数传递

function - 如何在 Rust 中实现多级柯里化(Currying)函数?

javascript - javascript中的curry函数是否使用闭包原则?

Haskell: `Map (a,b) c` 与 `Map a (Map b c)` 对比?