关于Currying结合filter的疑问:柯里化函数如何接收filter传入的obj?
柯里化函数与
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"));
嘿,我来一步步给你掰明白这个过程,其实核心就是搞清楚filter的工作机制和柯里化函数的执行逻辑:
先看柯里化函数
hasPower的本质
它是一个「返回函数的函数」:当你传入第一个参数power(比如这里的"Fire"),它不会直接返回布尔值,而是会吐出一个新的函数——这个新函数的逻辑已经被固定了:obj => obj.power === "Fire"(因为power已经被提前绑定成"Fire"了,这就是柯里化的核心价值:提前固化部分参数,生成定制化的函数)。再看
filter是怎么调用这个函数的
当你写dragons.filter(hasPower("Fire"))时,第一步会先执行hasPower("Fire"),得到我们刚才说的那个定制化函数。接下来filter就会开始遍历dragons数组:- 每遍历到一个元素(比如第一个
{ name: "Test1", power: "Fire" }),就把这个元素作为参数传给那个定制化函数; - 定制化函数接收这个
obj参数后,判断obj.power是不是等于"Fire",返回true或false; filter根据返回值决定要不要把当前元素放进结果数组里。
- 每遍历到一个元素(比如第一个
如果还是有点绕,我们可以把这个过程拆成更直白的写法,效果完全一样:
// 先执行hasPower("Fire"),得到专门检测"Fire"能力的函数 const checkIfFireDragon = obj => obj.power === "Fire"; // 然后把这个函数传给filter let fireDragons = dragons.filter(checkIfFireDragon);
你看,filter根本不关心这个回调函数是怎么来的,它只需要一个能接收数组元素、返回布尔值的函数就行。而柯里化的hasPower就是帮我们快速生成这种定制化回调的工具而已~
内容的提问来源于stack exchange,提问作者user6427229
相关产品推荐
相关产品推荐

