使用过滤器柯里化
Currying with filter
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"));
我知道柯里化部分,但我不明白柯里化函数是如何从过滤器传递 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
时,它只会 return 一个函数(稍后将执行)并且可以访问 power
变量。 (阅读更多:Closure)
现在是火龙,
let fireDragons = dragons.filter(hasPower("Fire"));
您正在将一个函数作为参数传递给过滤器函数(也调用它)。
当执行这行代码时,函数 hasPower("Fire")
将首先执行,并且从该函数 return 编辑的任何内容都将作为 callback
函数传递给过滤器.
基本上,它会变成这样:
let fireDragons = dragons.filter(function (obj) {
// Having access to the `hasPower` variable which is "Fire" in your case.
return obj.power === power;
});
或者完全像这样:
始终尝试在开发人员工具中进行调试以了解代码的工作原理,并随意将箭头函数替换为常规箭头函数以使其更加readable/understandable。
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"));
我知道柯里化部分,但我不明白柯里化函数是如何从过滤器传递 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 thearray
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
时,它只会 return 一个函数(稍后将执行)并且可以访问 power
变量。 (阅读更多:Closure)
现在是火龙,
let fireDragons = dragons.filter(hasPower("Fire"));
您正在将一个函数作为参数传递给过滤器函数(也调用它)。
当执行这行代码时,函数 hasPower("Fire")
将首先执行,并且从该函数 return 编辑的任何内容都将作为 callback
函数传递给过滤器.
基本上,它会变成这样:
let fireDragons = dragons.filter(function (obj) {
// Having access to the `hasPower` variable which is "Fire" in your case.
return obj.power === power;
});
或者完全像这样:
始终尝试在开发人员工具中进行调试以了解代码的工作原理,并随意将箭头函数替换为常规箭头函数以使其更加readable/understandable。