如何求一组数字的总和

IT技术 javascript jquery arrays
2021-01-27 03:00:33

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

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

6个回答

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

假设我们都使用 ES2015,我们可以让它不那么冗长: [1, 2, 3].reduce((a,b)=>a+b)
2021-03-27 03:00:33
实际上在 lisp 中,(apply #'+ '(1 2 3)). 我很惊讶在 JavaScript 中不能做同样的事情。我想如果我可以Math.max.apply(Math,[-12,-3.33,11,0,1]),那为什么不Math.sum.apply(Math,[-12,-3.33,11,0,1])呢?
2021-04-06 03:00:33
我会赞成,但已经有“1234”赞成票真的很漂亮。
2021-04-07 03:00:33

推荐(用默认值减少)

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

在 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 问题的答案,因为我认为它没有得到澄清。

您确实知道经过多年的使用,这种魔法reduce()仍然比简单的索引for()循环慢 25-30% jsperf.com/reduce-vs-loop/4
2021-03-24 03:00:33

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

var a = [1,2,3];
var sum = a.reduce(function(a, b) { return a + b; }, 0);
IE8 不支持它,看起来 jQuery 也不打算添加它。但是,Prototype 拥有它。
2021-03-12 03:00:33
什么是违反直觉的reduce()
2021-03-24 03:00:33
@s4njiArray.prototype.reduce() 数组减少为单个返回值。
2021-03-26 03:00:33
@Ishmael,您可以使用 UnderscoreJS,如果可用,它会回退到浏览器的实现,否则会实现自己的。
2021-04-01 03:00:33
@s4nji ...除非你减少酱汁——在这种情况下,你将它归结为它的基本要素,即没有水开销的所有口味的总和。:-)
2021-04-02 03:00:33
var arr = [1, 2, 3, 4];
var total = 0;
for (var i in arr) {
  total += arr[i];
}
@Sprog:但是,使用(var i=0; i<arr.length; i++)速度更快。即便如此,使用var sum=0; var i=arr.length; while(i--) sum += arr[i]速度仍然更快。
2021-03-20 03:00:33
@YSC 不,它没有。一个for...in在JavaScript中环路采取指数,这对于期望得到的值编码器共同绊脚石。for(var i in [1,2,3]) { console.log(i); }在控制台中尝试。)
2021-03-24 03:00:33
这比上面的 jQuery.each() 解决方案快得多。
2021-04-08 03:00:33
@BenjaminGruenbaum 假设没有任何内容向数组的原型添加可枚举属性...
2021-04-08 03:00:33
for... in在这种情况下_巧合_并且因为数组扩展了对象,所以在数组上使用循环是有效的。Riking的解决方案更好
2021-04-09 03:00:33
var total = 0;
$.each(arr,function() {
    total += this;
});
来自 OP:我认为 $.each 可能有用,但我不确定如何实现它。这可能不是最好的,但可以回答 OP 的要求。
2021-03-10 03:00:33
请,请,请使用reduce下面的答案当你没有的时候不要声明可变变量。
2021-03-18 03:00:33
@BrunoGrieder“不要在不需要时声明可变变量”是对命令式语言的极端偏见,它几乎不是任何想象中的代码味道。泰勒的回答绝对没有错,泰勒和弗洛里安的唯一区别是风格。
2021-03-18 03:00:33
这个答案正在元讨论中
2021-03-26 03:00:33
请不要使用它,即使它是“已接受的答案”;下面弗洛里安的回答要好得多!
2021-03-28 03:00:33