JavaScript 函数珂里化
为什么需要珂里化
在函数式编程中,我们想尽可能地让一个函数处理的问题尽可能单一,而不是在一个函数中处理大堆问题。
珂里化就是将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果。
举例
例子1
已知参数个数为3,实现 add 方法,使得 add(1)(2)(3) 输出结果为 6
function add(x) {
return function (y) {
return function (z) {
return x + y + z;
};
};
}
console.log(add(1)(2)(3));//6
//使用箭头函数简写方式:
let add2 = (x) => (y) => (z) => x + y + z;
console.log(add2(1)(2)(3));//6
例子2
实现方法 add,不限参数,不限格式,使得
add(1)(2)(3)(4)=10;
add(1)(1,2,3)(2)=9;
function add() {
let arg = [...arguments]; //arguments 伪数组转成数组
//获取所有参数
let fn = function () {
arg.push(...arguments);
return fn;
};
//所有参数相加
fn.toString = function () {
let res = arg.reduce((pre, cur) => {
return pre + cur;
});
return res;
};
return fn;
}
let res1 = add(1)(2)(3)(4);
let res2 = add(1)(1, 2, 3)(2);
console.log(+res1); //需要进行一个隐性转换才能调用 toString 方法进行相加
console.log(+res2);
例子3
珂里化实现查找由对象组成地数组里面某个属性所有的值;
let nameList1 = [
{ name: "hello", age: 12 },
{ name: "Pink", age: 30 },
{ name: "Mike", age: 23 },
];
let nameList2 = [
{ acd: "车轮", profession: "ADC" },
{ acd: "辐条", profession: "ADC" },
{ acd: "方向盘", profession: "ADC" },
];
let curring = (key) => (element) => element[key];
let findName = curring("name");
let findAcd = curring("acd");
console.log(nameList1.map((item) => findName(item))); //[ 'hello', 'Pink', 'Mike' ]
console.log(nameList2.map((item) => findAcd(item))); //[ '车轮', '辐条', '方向盘' ]