网易课程学习——JS进阶(compose与pipe函数)

131 阅读1分钟

面对函数式编程,低耦合高内聚一个基本需求,所以一些复杂的逻辑可以拆分为多个简单的逻辑进行操作,如下代码,每一个函数就单一的实现了加、减、乘的基本功能。

function multiplyValue(num, value) {
    return num * value;
}

function addValue(num, value) {
    return num + value;
}

function minusValue(num, value) {
    return num - value
}

如今有个需求,是对4进行先减1后加2最后乘3,那么借用上面的函数,则是通过以下两种方法实现

let result = minusValue(4,1)
result = addValue(result,2)
result = multiplyValue(result,3) // 15

let result = multiplyValue(addValue(minusValue(4,1),2),3); // 15

compose和pipe函数

  • compose函数可以理解为为了方便执行这些连续的方法,把传值调用的过程封装了起来,我们只需要给compose函数传递需要执行的方法,他就会从左往右自动执行,将上一次的结果作为下一次的参数传入,这里使用数组的reduce方法实现。
function compose() {
    const args = Array.from(arguments);
    return function (num) {
        const _args = [...arguments].slice(1);
        return args.reduce((acc, curr, i) => {
            return  curr(acc, _args[i])
        }, num);
    }
}

compose(minusValue, addValue, multiplyValue)(4, 1, 2, 3) // 15
  • pipe函数 与compose函数类似,不过执行顺序是从右往左执行,所以将reduce方法改为reduceRight就好
function pipe() {
    const args = Array.from(arguments);
    return function (num) {
        const _value = [...arguments].slice(1);
        return args.reduceRight((acc, curr, i) => {
            return  curr(acc, _value[i])
        }, num);
    }
}

console.log(pipe(minusValue, addValue, multiplyValue)(4, 1, 3, 5)); // 22