js-challenges icon indicating copy to clipboard operation
js-challenges copied to clipboard

实现管道函数

Open Sunny-117 opened this issue 3 years ago • 4 comments

Sunny-117 avatar Nov 03 '22 08:11 Sunny-117

function pipe(...funcs) {
  return function (value) {
    return funcs.reduce((currentValue, func) => func(currentValue), value);
  }
}

bearki99 avatar Feb 20 '23 13:02 bearki99

  • 楼上的方法只能单参传递
  • 不妨看看我的
function pipe(...args1){
    return function(...args2){
        if(args1.length === 0) return;
        if(args1.length === 1) return args1[0](...args2);
        return args1.reduce((a, b) => function(){
                return b(a(...args2))
        })()
    }
};

veneno-o avatar Mar 15 '23 16:03 veneno-o

  • 楼上没有考虑前一个值不是函数的情况呢
function pipe(...fns) {
    return function(...args) {
        if (fns.length === 0) return;
        if (fns.length === 1) return fns[0](...args);
        
        return fns.reduce((acc, fn) => {
            if (typeof acc === 'function') {
                acc = acc(...args);
                args = []; // 清空参数列表,因为之后的函数应该接收上一个函数的结果作为输入
            }
            return fn(acc); // 将上一步骤得到结果作为当前操作器输入
        });
    };
}

kangkang123269 avatar Aug 30 '23 07:08 kangkang123269

function pipe(...fns) {
    return function (...args) {
        return fns.reduce((v, f2, i) => {
            if (typeof f2 !== 'function') {
                throw new TypeError(`${typeof f2} is not a function`)
            }
            return i ? f2(v) : f2(...v)
        }, args)
    }
}

Aurora-GSW avatar Mar 05 '24 02:03 Aurora-GSW