给定一个数组[1, 2, 3, 4]
,如何找到其元素的总和?(在这种情况下,总和将为10
。)
我认为$.each
可能有用,但我不确定如何实现它。
给定一个数组[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)
)
你得到一个类型错误
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);
var arr = [1, 2, 3, 4];
var total = 0;
for (var i in arr) {
total += arr[i];
}
var total = 0;
$.each(arr,function() {
total += this;
});