【问题标题】:JavaScript Add function called as many times as you wantedJavaScript Add 函数被调用多次
【发布时间】:2017-11-16 21:20:31
【问题描述】:

最简单的问题是编写一个可以返回所有参数之和的函数。我怎么能这样做?

function add () {

}
add(1)(2)(3)();  //6
add(5)(6)(7)(8)(9)()  //35

【问题讨论】:

  • 你的努力在哪里?
  • 请尝试编写此函数。我建议根据您的技能水平将“无限参数”更改为数组。
  • 这不是一个返回“所有参数”之和的函数,只有一个参数,你调用add一次,然后调用其他函数。
  • 返回所有参数之和的函数将被称为add(1, 2, 3)

标签: javascript


【解决方案1】:

我认为这正是您所需要的:

function add(value) {
   return (val) => val !== undefined ? add(value + val) : value;
}

console.log(add(2)(2)()); //4
console.log(add(2)(2)(5)(5)()); //14
console.log(add(1)(1)(1)(1)(1)()); //5
console.log(add(1)(1)(0)(1)(1)()); //4

工作原理

对于每个调用,它在内部声明一个函数,结果它在每个调用中创建一个闭包(持久范围)。由于现有的闭包,以这种方式创建的函数可以访问其参数 + 先前的调用参数。

所以如果我调用 add(2)(3)():

  • add(2) - 返回具有可见 2 值的函数
  • add(2)(3) - 使用输入 2 + 3 调用第二个函数并返回可见值等于 5 的第三个函数
  • add(2)(3)() - 由于参数为空而结束计算并返回值

要完成计算管道,最后一次调用需要没有值。

【讨论】:

  • @KonradD 我做了,如果在 OP 的问题中使用,效果很好。
  • 睾丸和魅力:)。等等我加个sn-p
  • @MaciejSikora - 不错的答案(UVed),但如果 val 为 0,val ? 也会返回结果。
  • @KonradD 因为函数返回一个函数。最后一次调用不带参数使三元表达式失败,因此不会继续add
  • @KonradD 我修复了 0 问题 + 添加了一些描述
【解决方案2】:

基本思想是使用可以更新的变量sum 创建一个闭包,如果值未定义,则返回sum,或者内部函数:

const add = (n) => {
  let sum;
  
  const inner = (n) => n === undefined ? sum : (sum = (sum || 0) + n, inner);
  
  return inner(n);
};

console.log(add(1)(2)(3)());  //6
console.log(add(5)(6)(7)(8)(9)());  //35

【讨论】:

  • 像这样的 IMO 问题最好留给提问者作为练习,可能会为如何解决这些问题提供提示。教人钓鱼等等。
  • @DaveNewton - 我知道,但我并不真正关心 OP。只是想看看其他答案。
  • AFAICT 不需要发布答案,但可以。
  • @DaveNewton 这种方法完全错误是不正确的。它接近于柯里化,并且能够在应用程序上使用具有封装值的函数而不是变量。您将线程函数作为一等公民,而不是具有纯值的变量。
  • @MaciejSikora 我认为这根本没有错,我只是反对回答没有任何努力的问题。像OP被问到的问题的重点是(a)衡量知识,或者(b)让他们思考。交出答案在这两个方面都违背了目的。 YMMV。
【解决方案3】:

我会像这样使用Spread syntax

function add(...values) {
  return values.reduce((sum, value) => sum + value, 0)
}

console.log(add(1, 4, 34, 45, 3, 4, 5))

【讨论】:

  • 解决了一个不同的问题。
  • 观察 OP 的问题:add(5)(6)(7)(8)(9)() 这不是一个带多个参数的函数,而是一个返回函数的函数。
  • ¯\(°_o)/¯ 这不是一个不常见的面试问题或课堂练习;它显示了对非平凡 JS 的基本理解。
  • @GetOffMyLawn 而不是 forEach 你应该使用 reduce 并且根本不需要这个 sum 变量。
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 2013-07-02
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多