组合
2024年03月12日
一、认识
函数组合 (compose
) 如果一个函数要经过多个函数处理才能得到最终值,这个时候可以把中间过程的函数合并成一个函数。函数就像是数据的管道,函数组合就是把这些管道连接起来,让数据穿过多个管道形成最终结果。函数组合默认是从右到左执行。函数组合
可以让我们把细粒度的函数重新组合生成一个新的函数,从而避免书写洋葱代码,比如h(g(f(x)))
;
函数组合 (compose
) 要满足的条件: 一、组合函数要满足结合律,即compose(compose(f,g),h)
的结果和compose(f,compose(g,h))
结果都是一样的;
二、实现
2.1 while
实现
function compose(...funcArray) {
const length = funcArray.length;
for (let i = 0; i < length; i++) {
if (typeof funcArray[i] !== "function") {
throw new TypeError(`第${i + 1}个参数不是函数`);
}
}
return function (args) {
let index = length - 1;
let result = args;
while (index > -1) {
result = funcArray[index--].call(this, result);
}
return result;
};
}
测试
function fun1(inputValue) {
return inputValue + "fun1加工";
}
function fun2(inputValue) {
return inputValue + "fun2加工";
}
function fun3(inputValue) {
return inputValue + "fun3加工";
}
const resultFun = compose(fun3, fun2, fun1);
const result = resultFun("初始值");
console.log(result);
2.2 reduce
实现
function compose(...funcArray) {
const length = funcArray.length;
for (let i = 0; i < length; i++) {
if (typeof funcArray[i] !== "function") {
throw new TypeError(`第${i}个参数不是函数类型`);
}
}
return function (args) {
return funcArray.reduceRight((accumulator, currentValue) => {
return currentValue(accumulator)
},args);
};
}
测试
function fun1(inputValue) {
return inputValue + "fun1加工";
}
function fun2(inputValue) {
return inputValue + "fun2加工";
}
function fun3(inputValue) {
return inputValue + "fun3加工";
}
const resultFun = compose(fun3, fun2, fun1);
const result = resultFun("初始值");
console.log(result);