跳到主要内容

组合

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);