如何编写一个名为“ add”的函数。这样一来,一旦它收到2个参数,就返回2个值的总和

时间:2019-02-05 21:05:49

标签: javascript ecmascript-6 closures

如何编写名为add的单个函数。这样一来,一旦它收到2个参数,就返回2个值的总和。假设所有值都是数字。

例如 // add(1,2)= 3

// add(1)(2)= 3

// add()(1)()(2)= 3

// add()(1)(2)= 3

5 个答案:

答案 0 :(得分:1)

太简单了:

 const curry = (fn, ...previous) => (...args) => args.length + previous.length >= fn.length ? fn(...previous, ...args) : curry(fn, ...previous, ...args);

 const add = curry((a, b) => a + b);

答案 1 :(得分:1)

  

我尝试过

function calcSum(a,b){ var ab = function (b) { return a+b; } if(typeof a == 'undefined'){ return ab; } if(typeof b == 'undefined'){ return ab; } else { return ab(b); } }

这看起来还不错-适用于calcSum(1,2)calcSum(1)(2)。但是,您没有正确处理未通过任何内容(或undefined)的情况:

  • calcSum()应该返回仍需要两个参数的函数
  • calcSum(1)() = ab()应该返回一个仍需要一个参数的函数

您已经匹配第一种情况,但是您返回了ab(仅接受一个值),而不是calcSum(将接受两个值的函数)。要解决此问题,请使用

function calcSum(a,b){
    var ab = function(b) {
        if (typeof b == 'undefined') return ab;
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        else return a+b;
    }
    if (typeof a == 'undefined') return calcSum;
//                                      ^^^^^^^^
    if (typeof b == 'undefined') return ab; // actually you don't need this, ab(b) already handles this case as well now
    else return ab(b);
}

答案 2 :(得分:0)

let add = (...a)=>a.length==2 ? a[0]+a[1] : (...b)=>add(...a.concat(b));

这个想法很简单...我们声明了一个可变参数函数,如果我们有两个元素,那么就完成了(并返回总和),否则我们将返回一个新的可变参数函数,该函数将收集更多的元素并递归调用函数本身传递已经a与新元素b连接的内容。

答案 3 :(得分:0)

您对此建议有何看法?

function add(){
  return Array.from(arguments).reduce((accumulator, currentValue) => accumulator + currentValue)
}

// you can also add as many argument you want.
const b = add(1,2,3,4); // 10

答案 4 :(得分:0)

const add = (...toAddArr) => {
    let result = 0;
    for (let toAddNr of toAddArr) {
        result += toAddNr;
    }
    return result;
}

console.log(add(1、2、3、4、5));

此示例使用rest operator获取无限的参数并将其作为数组传递,并使用for/of loop对其进行迭代。