Skip to content

Latest commit

 

History

History
70 lines (52 loc) · 1.34 KB

函数组合.md

File metadata and controls

70 lines (52 loc) · 1.34 KB

利用数组的reduce方法,将多个函数进行组合

function add(num1){
    return num1+1
}

function double(num1){
    return num1 * 2
}

function compose(...fns){
    return function(arg){
        return fns.reduce((prev, fn)=>{
                return fn(prev)
            },arg)
    }
}


let newFn = compose(double,add)
console.log(newFn(10))

考虑一些优化的情况:

  1. 如果给组合函数参数列表传入的函数个数为 0,则直接返回调用时的值
  2. 如果组合函数参数列表只接收到了一个函数,则直接执行该函数,不必进行reduce处理
function add(num1){
    return num1+1
}

function double(num1){
    return num1 * 2
}

function compose(...fns){
    if(fns.length === 0) return arg => arg
    if(fns.length === 1) return fns[0]
    return function(arg){
        return fns.reduce((prev, fn)=>{
                return fn(prev)
            },arg)
    }
}


let newFn = compose(double,add)
console.log(newFn(10)) // 21

let newFn2 = compose()
console.log(newFn2(10)) // 10

let newFn3 = compose(double)
console.log(newFn3(10)) // 20

还可以写的更简洁一些:

function compose(...fns){
    if(fns.length === 0) return arg => arg
    if(fns.length === 1) return fns[0]
    return fns.reduce((result, fn) => (...args) => result(fn(...args)))
}