在最近的一次采访中,我被要求编写一个添加数字并接受如下参数的函数:
add(1)(2)(3) // result is 6
add(1,2)(3,4)(5) // result is 15
参数的数量不固定,参数可以按集合传递,也可以单独传递。
如何实现此add
功能?
答案 0 :(得分:1)
我参加聚会有点晚了,但是像这样的事情还是可以的(虽然在我看来有点hacky):
const add = (a, ...restA) => {
const fn = (b, ...restB) => {
return add([a, ...restA].reduce((x, y) => x + y) + [b, ...restB].reduce((x, y) => x + y))
};
fn.valueOf = () => {
return [a, ...restA].reduce((x, y) => x + y)
};
return fn;
}
此函数返回一个具有和值的函数。下面的测试将输出强制值而不是实际函数。
console.log(+add(1,2)(3,4)(5)); // 15
console.log(+add(1)) // 1
console.log(+add(1)(2)) // 3
console.log(+add(1)(2)(3)) // 6
console.log(+add(1)(2)(3)(4)) // 10
由于它是一个循环函数,它将始终返回另一个函数,因此您可以执行以下操作:
const addTwo = add(2);
console.log(+addTwo(5)); // 7
答案 1 :(得分:0)
使用reduce和spread可以实现如下
function calc(...args1){
return function (...args2){
return function (...args3){
let merge = [...args1, ...args2, ...args3]
return merge.reduce((x ,y)=> x + y) ;
}
}
}
let sum = calc(10)(1)(4);
console.log("sum",sum);
答案 2 :(得分:0)
他们可能想知道您对“javascript 内部结构”的熟悉程度,例如如何以及何时在幕后调用 Function#toString
和 Function#valueOf
、Function#[Symbol.toPrimitive]
等方法。
const add = (...numbers) => {
const cadd = (...args) => add(...args, ...numbers);
cadd[Symbol.toPrimitive] = () => numbers.reduce((a, b) => a + b);
return cadd;
}
console.log(
`add(1,2)(3,4)(5) =>`, add(1,2)(3,4)(5),
); // result is 15
console.log(
`add(1,2) =>`, add(1,2),
); // result is 3
console.log(
`add(1,2)(5)(1,2)(5)(1,2)(5)(1,2)(5) =>`, add(1,2)(5)(1,2)(5)(1,2)(5)(1,2)(5),
); // result is 32