Я хочу написать функцию добавления, которая выдает правильный вывод для каждого из этих выражений.
add(1)(2, 3)(4)
add(1)(2)(3)(4)
add(1, 2, 3, 4)
Я пробовал три метода, но все три метода ошибочны.У вас есть лучший метод?
Вот три метода, которые я попробовал:
function add() {
var arg = Array.prototype.slice.call(arguments);
var fn = function() {
arg = arg.concat(Array.prototype.slice.call(arguments));
return add.apply(null, arg);
}
fn.valueOf = function() {
return arg.reduce(function(a, b) {
return a + b;
})
}
return fn;
}
console.log(add(1,2,3,4));
console.log(add(1)(2,3)(4));
console.log(add(1)(2)(3)(4));
Недостаток в том, что в Chrome этот методпечатает символ f (представляющий функцию) перед каждым результатом, и в Firefox он не вступает в силу и просто печатает как функцию.
function curry(fn) {
var arg = [];
return function() {
if(arguments.length === 0) {
return fn.apply(null, arg);
}
else {
arg = arg.concat(Array.prototype.slice.call(arguments));
return arguments.callee;
}
}
}
var add = curry(function() {
var arg = [].slice.call(arguments);
return arg.reduce(function(a, b) {
return a + b;
})
})
console.log(add(1, 2, 3, 4)(10, 20)()); // 40
Недостатком является то, что при каждом использовании требуется дополнительный вызов, чтобы сообщить функции, что пора вызывать fn, в противном случае результатом является сама функция.
function curry(fn, length) {
return function currying(...arg) {
if(arg.length < length) {
return function(...arg1) {
return currying.apply(this, arg.concat(arg1));
}
}
else {
return fn.apply(this, arg);
}
}
}
var add = curry(function(...arg) {
return arg.reduce(function(a, b) {
return a + b;
})
}, 4) // This 4 right here means the number of Numbers to add
Недостатком является то, что вам нужно заранее знать, сколько чисел добавить, и передать его в карри в качестве параметра.