在JavaScript中使用未知参数计算函数

时间:2018-05-10 18:23:45

标签: javascript functional-programming

在最近的一次采访中,我被要求编写一个添加数字并接受如下参数的函数:

add(1)(2)(3) // result is 6
add(1,2)(3,4)(5) // result is 15

参数的数量不固定,参数可以按集合传递,也可以单独传递。

如何实现此add功能?

3 个答案:

答案 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#toStringFunction#valueOfFunction#[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