如何编写名为add
的单个函数。这样一来,一旦它收到2个参数,就返回2个值的总和。假设所有值都是数字。
例如 // add(1,2)= 3
// add(1)(2)= 3
// add()(1)()(2)= 3
// add()(1)(2)= 3
答案 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对其进行迭代。