js-challenges
js-challenges copied to clipboard
实现管道函数
function pipe(...funcs) {
return function (value) {
return funcs.reduce((currentValue, func) => func(currentValue), value);
}
}
- 楼上的方法只能单参传递
- 不妨看看我的
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))
})()
}
};
- 楼上没有考虑前一个值不是函数的情况呢
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); // 将上一步骤得到结果作为当前操作器输入
});
};
}
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)
}
}