多次调用函数并保存结果

calling a function several times with saving result

我有一个问题。

我需要设计一个函数 add() 来总结给定的参数。问题是它应该可以通过以下几种方式调用:

add(1, 2, 3, 4, 5) // outputs 15
add(1, 2)(3)(4, 5) // outputs 15
add(1, 2, 3)(4, 5) // outputs 15

如果函数的内部没有问题并且可以这样实现:

return arg.reduce((prev, current) => prev + current)

参数个数始终为5个,不多也不少

但是,我不确定如何处理这里的连续调用。有人有什么想法吗?

非常感谢。

add return 一个在其范围内有一个持久数组的函数,它会累积地跟踪所有传入的参数。在每次调用时,push 到该数组 - 一旦该数组有 5 个项目,return 求和数组作为一个数字,否则,return 相同的函数:

function add(...initialArgs) {
  const allArgs = [];
  function inner(...args) {
    allArgs.push(...args);
    return allArgs.length === 5
     ? allArgs.reduce((a, b) => a + b)
     : inner;
  }
  return inner(...initialArgs)
}

console.log(add(1, 2, 3, 4, 5)) // outputs 15
console.log(add(1, 2)(3)(4, 5)) // outputs 15
console.log(add(1, 2, 3)(4, 5)) // outputs 15

当然,这取决于事先知道参数总数总是恰好为 5。

这是一种通用方法,您可以将动态参数传递给下面的 "add" 函数,"parseAdd" 函数会处理它。

总的来说这个问题属于"currying"函数的范畴,值得一读。此外,了解 bind and function.toString() 将有助于您更好地理解这种方法。

function addition(...args) {
  return args.reduce((conc, v) => conc += v ,0)
}
                
            
function parseAdd(fn) {
  var newFn = fn.bind(null);

  function cal(...args) {
    newFn = newFn.bind(null, ...args);
    return cal;
  }

  cal.toString = () => newFn();

  return (...arg) => { newFn = fn.bind(null); return cal(...arg) }
}
                
           
var add = parseAdd(addition);

console.log(add(1,2,3,4))
console.log(add(1,2,3)(4)(5))
console.log(add(1)(2)(3)(4)(5)(6))