在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)
)
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);