constmap = (arr, func) => { let ans = []; for (let a of arr) ans.push(func(a)); return ans; }
1 2 3 4 5 6 7 8 9
constfilter = (arr, func) => { let ans = []; for (let a of arr) { if (func(a)) { ans.push(a); } } return ans; }
1 2 3 4 5 6 7 8 9 10 11
constreduce = (arr, func, initial) => { let start = 0; if (!initial) { initial = arr[0]; start++; } for (let i = start; i < arr.length; i++) { initial = func(initial, arr[i]) } return initial; }
柯里化 currying
柯里化是把一个多参数函数转化为一个嵌套的一元函数的过程。
举个简单的例子:将 add 函数分解
1 2 3 4
// 多参数函数写法 constadd = (x, y) => x + y; // add(2, 3) // 嵌套的一元函数,即柯里化 constaddCurry = x => y => x + y; // addCurry(2)(3)
或者将其抽离出来:
1 2
constcurry = func => x =>y =>func(x, y); let addCurry = curry(add); // addCurry(2)(3)
使用:
1 2 3 4
const temp = addCurry(10);
temp(2); // 12 temp(10); // 20
柯里化可以将一个多参数函数分解成一个一步步往下走的链状函数,类似于数据流:
1 2 3 4 5 6 7 8
let curryedFunc = curryn(func);
let sorted = curryedFunc(param); let filtered = sorted(param2); let maped = filtered(param3); let ans = maped(param4); // or // ans = curryedFunc(param)(param2)(param3)(param4);
利用柯里化还可以缓存结果,有利于复用。比如:
1 2 3 4 5 6 7 8
letisEven = f => arr => arr.filter(f); let findEven = isEven(i => i % 2 == 0);