协慌网

登录 贡献 社区

如何找到数字数组的总和

给定一个数组[1, 2, 3, 4] ,如何找到其元素的总和? (在这种情况下,总和为10

我以为$.each可能有用,但是我不确定如何实现它。

答案

Lisp 中 ,这正是reduce工作量的工作。您会看到以下代码:

(reduce #'+ '(1 2 3)) ; 6

幸运的是,在 JavaScript 中,我们还具有reduce !不幸的是, +是运算符,而不是函数。但是我们可以使其漂亮!在这里,看看:

const sum = [1, 2, 3].reduce(add,0); // with initial value to avoid when the array is empty

function add(accumulator, a) {
    return accumulator + a;
}

console.log(sum); // 6

那不是很漂亮吗? :-)

更好!如果您使用的是 ECMAScript 2015(又名ECMAScript 6 ),它可能会很漂亮:

const sum = [1, 2, 3].reduce((partial_sum, a) => partial_sum + a,0); 
console.log(sum); // 6

推荐(减少默认值)

Array.prototype.reduce可用于遍历数组,将当前元素值添加到先前元素值的总和中。

console.log(
  [1, 2, 3, 4].reduce((a, b) => a + b, 0)
)
console.log(
  [].reduce((a, b) => a + b, 0)
)

没有默认值

您收到 TypeError

console.log(
  [].reduce((a, b) => a + b)
)

在 ES6 的箭头功能之前

console.log(
  [1,2,3].reduce(function(acc, val) { return acc + val; }, 0)
)

console.log(
  [].reduce(function(acc, val) { return acc + val; }, 0)
)

非数字输入

如果非数字是可能的输入,您可能要处理呢?

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => a + b)
)

let numOr0 = n => isNaN(n) ? 0 : n

console.log(
  ["hi", 1, 2, "frog"].reduce((a, b) => 
    numOr0(a) + numOr0(b))
)

不建议危险的评估使用

我们可以使用eval执行 JavaScript 代码的字符串表示形式。使用 Array.prototype.join 函数将数组转换为字符串,我们将 [1,2,3] 更改为 “1 + 2 + 3”,其结果为 6。

console.log(
  eval([1,2,3].join('+'))
)

//This way is dangerous if the array is built
// from user input as it may be exploited eg: 

eval([1,"2;alert('Malicious code!')"].join('+'))

当然,显示警报并不是可能发生的最糟糕的事情。我将其包括在内的唯一原因是作为对 Ortund 问题的回答,因为我认为这没有得到澄清。

为什么不减少?通常这有点反直观,但使用它来查找总和非常简单:

var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);