Javascript无限促成加法,它支持无限调用和每次调用具有无限参数吗?

时间:2018-11-27 18:04:54

标签: javascript arrays addition

在最近的一次采访中,我被要求创建下面的代码片段中描述的功能

add(2,3,4)(5,6)(7,8); // Should yield 35

如上面的代码片段所示,有一个名为“ add”的函数可以无限调用,每次调用可以容纳无限个参数。最后,它应该返回所有调用中所有参数的总和。

下面是部分解决方案,它要求不带参数的最终调用。

/**
 * @description
 * infiniteAdd(2,3)(4,5)(6,7)()
 * Above operation yields 27
 */

function infiniteAdd() {
  // Creating closure for subsequent function invocations
  var prevArgs = Array.prototype.slice.call(arguments);

  return function() {
    var currArgs = Array.prototype.concat.call(prevArgs, Array.prototype.slice.call(arguments));

    if (arguments.length < 1) {
      // if no arguments than calculate sum
      return Array.prototype.reduce.call(currArgs,
        function(acc, curr) {
          return acc + curr;
        }
      );
    }
    
    // Recursively call the main function till no more arguments provided
    return infiniteAdd.apply(null, currArgs);
  }
}

console.log(infiniteAdd(2, 3)(4, 5)(6, 7)());

1 个答案:

答案 0 :(得分:1)

您可以像下面那样实现currying功能进行添加

function addition(...args) {
  return args.reduce((a, b) => a + b)
}

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(2, 3, 4)(5, 6)(7, 8))