使用reduce实现聚合函数

2,348 阅读1分钟

看到一个思考题挺有意思:有如下函数,聚合成一个函数,并把第一个函数的返回值传递给下一个函数,如何处理。

function f1(arg) {
  console.log("f1", arg);
  return arg;
}
function f2(arg) {
  console.log("f2", arg);
  return arg;
}
function f3(arg) {
  console.log("f3", arg);
  return arg;
}

当然最简单的实现就是函数执行,把函数当作参数嵌套执行即可

let res = f1(f2(f3("omg"))); 如果要使用函数来实现的话就需要reduce来实现

let res = compose(f1, f2, f3)("omg");
function compose(...funcs) {
  // 使用reduce处理
  return funcs.reduce((a, b) => (...args) => a(b(...args)));
}

再考虑一种情况,如果没有传值呢,则需要多进行一个判断

let res = compose()("omg");
function compose(...funcs) {
  if (funcs.length === 0) {
    // return arg => arg;
    // 或
    return () => {};
  }
  if (funcs.length === 1) {
    return funcs[0];
  }
  return funcs.reduce((a, b) => (...args) => a(b(...args)));
}