如何find一个数组的总和
给定一个数组[1, 2, 3, 4]
,我怎么能find它的元素的总和? (在这种情况下,总和为10
。
我以为$.each
可能是有用的,但我不知道如何实现它。
在Lisp中 ,这正是reduce
的工作。 你会看到这样的代码:
(reduce #'+ '(1 2 3)) ; 6
幸运的是,在JavaScript中,我们也有reduce
! 不幸的是, +
是一个操作符,而不是一个函数。 但是,我们可以做到这一点! 在这里,看看:
var sum = [1, 2, 3].reduce(add, 0); function add(a, b) { return a + b; } console.log(sum); // 6
这不漂亮吗? 🙂
更好! 如果您使用ECMAScript 2015(又名ECMAScript 6 ),可以这样做:
var sum = [1, 2, 3].reduce((a, b) => a + b, 0); console.log(sum); // 6
为什么不减less? 这通常有点反直觉,但使用它来find一个总和是非常简单的:
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; });
这可以通过遍历所有项目,并将它们添加到每个迭代到sum
variables。
var array = [1, 2, 3]; for (var i = 0, sum = 0; i < array.length; sum += array[i++]) ;
JavaScript不知道块的范围,所以sum
将是可访问的:
console.log(sum); // => 6
与上面相同,但注释和准备作为一个简单的function:
function sumArray(array) { for ( var index = 0, // The iterator length = array.length, // Cache the array length sum = 0; // The total amount index < length; // The "for"-loop condition sum += array[index++] // Add number on each iteration ); return sum; }
arr.reduce(function (a, b) { return a + b; });
参考: Array.prototype.reduce()
// Given array 'arr' var i = arr.length; var sum = 0; while (--i) sum += arr[i];
这将平均需要1.57ms / run(在100个随机正常数字的arrays上测量1000次),而使用上面的eval()
方法运行的是3.604ms,运行的标准是2.151ms / ,++)循环。
方法说明:此testing是在Google Apps脚本服务器上运行的,因此它们的JavaScript引擎与Chrome几乎相同。
编辑:– --i
而不是我 – 每运行保存0.12毫秒(我是1.7)
编辑:神圣的咒骂,没关系这整个职位。 使用上面提到的reduce()方法,只有1 ms / run。
你也可以使用reduceRight。
[1,2,3,4,5,6].reduceRight(function(a,b){return a+b;})
结果输出为21。
参考: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
如果你碰巧使用Lodash,你可以使用sum函数
array = [1, 2, 3, 4]; sum = _.sum(array);//10
任何人都像我一样寻找一个function上的指针? 拿着它:
sum= arr.reduce(function (a, b) {return a + b;}, 0);
有趣的方法:
eval([1,2,3].join("+"))
标准的JavaScript解决scheme:
var addition = []; addition.push(2); addition.push(3); var total = 0; for (var i = 0; i < addition.length; i++) { total += addition[i]; } alert(total); // Just to output an example /* console.log(total); // Just to output an example with Firebug */
这适用于我(结果应该是5)。 我希望在这种解决scheme中没有隐藏的缺点。
我一般都是使用JavaScript和编码的初学者,但是我发现一个简单而简单的方法来对数组中的数字进行求和就像这样:
var myNumbers = [1,2,3,4,5] var total = 0; for(i=0; i<myArray.length; i++){ total += myArray[i]; }
基本上,我想贡献一下,因为我没有看到许多不使用内置函数的解决scheme,而且这种方法很容易编写和理解。
一小段JavaScript代码可以完成这项工作:
var numbers = [1,2,3,4]; var totalAmount = 0; for (var x = 0; x < numbers.length; x++) { totalAmount += numbers[x]; } console.log(totalAmount); //10 (1+2+3+4)
推荐的方法
[1,2,3].reduce(function(acc, val) { return acc + val; });
可以使用Array.prototype.reduce遍历数组,将当前元素值添加到前面元素值的总和中。
危险的方式
eval([1,2,3].join('+'));
我们可以使用eval来执行JavaScript代码的string表示。 使用Array.prototype.join函数将数组转换为string,我们将[1,2,3]改为“1 + 2 + 3”,计算结果为6。
这种方式是危险的,如果数组是从用户input构build,因为它可能会被利用,例如:
eval([1,"2;alert('Malicious code!')"].join('+'))
将导致与文本恶意代码警报。 我列入这个的唯一原因是作为一个答案,因为我不认为这是澄清的,我不能添加评论呢。
var totally = eval(arr.join('+'))
这样,你可以把各种奇特的东西放在arrays中。
var arr = ['(1/3)','Date.now()','foo','bar()',1,2,3,4]
我只是半开玩笑。
这里很酷的技巧,我有很多安全的传统答案,而不是cachingarrays的长度nitselect。
function arraySum(array){ var total = 0, len = array.length; for (var i = 0; i < len; i++){ total += array[i]; } return total; }; var my_array = [1,2,3,4]; // Returns 10 console.log( arraySum( my_array ) );
如果不caching数组的长度,JS编译器需要在循环的每次迭代中通过数组来计算长度,但在大多数情况下,这是不必要的开销。 V8和许多现代浏览器为我们优化了这一点,所以它不是那么重要,但是有一些老设备可以从这个简单的caching中受益。
如果长度可能发生变化,如果您不知道为什么要caching长度,那么可能会导致一些意想不到的副作用,但是对于一个仅用于获取数组并将值添加到一起的可重用函数非常适合。
这里是这个arraySum函数的CodePen链接。 http://codepen.io/brandonbrule/pen/ZGEJyV
这可能是一种过时的思维方式,但我认为在这种情况下使用它并不是什么坏处。
这些都是非常好的答案,但是如果数字按照问题(1,2,3,4)顺序排列,那么可以通过应用公式(n *(n + 1))/ 2 n是最后一个数字
这很容易
function sumArray(arr) { var total = 0; arr.forEach(function(element){ total += element; }) return total; } var sum = sumArray([1,2,3,4]) console.log(sum)
Object.defineProperty(Object.prototype, 'sum', { enumerable:false, value:function() { var t=0;for(var i in this) if (!isNaN(this[i])) t+=this[i]; return t; } }); [20,25,27.1].sum() // 72.1 [10,"forty-two",23].sum() // 33 [Math.PI,0,-1,1].sum() // 3.141592653589793 [Math.PI,Math.E,-1000000000].sum() // -999999994.1401255 o = {a:1,b:31,c:"roffelz",someOtherProperty:21.52} console.log(o.sum()); // 53.519999999999996
使用reduce
let arr = [1, 2, 3, 4]; let sum = arr.reduce((v, i) => (v + i)); console.log(sum);
尝试这个…
function arrSum(arr){ total = 0; arr.forEach(function(key){ total = total + key; }); return total; }
香草JavaScript是你所需要的一切:
> a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; a.forEach(function(e){sum += e}); sum 10 > a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; a.forEach(e => sum += e); sum 10 > a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; for(e in a) sum += e; sum "00123foobar" > a = [1,2,3,4]; a.foo = 5; a['bar'] = 6; sum = 0; for(e of a) sum += e; sum 10
有几个人build议在Array.prototype
添加一个.sum()
方法。 这通常被认为是不好的做法,所以我不build议你这样做。
如果你仍然坚持这样做,那么这是一个简洁的写作方式:
Array.prototype.sum = function() {return [].reduce.call(this, (a,i) => a+i, 0);}
那么: [1,2].sum(); // 3
[1,2].sum(); // 3
请注意,添加到原型的function正在使用ES5和ES6function和箭头语法的混合。 该function
声明为允许该方法从您正在操作的Array
中获取this
上下文。 我在reduce
调用中使用了=>
。
使用recursion
var sum = (arr) => arr.length === 1 ? arr[0] : arr.shift() + sum(arr); sum([1,2,3,4]) // 10
在我看来,最好的方式来获得数组的总和。
var size = A.length; var sum = (size + 1) * (size + 2) / 2;
使用map
:
var sum = 0; arr.map(function(item){ sum += item; }); // sum now contains the total.
您可以将该方法添加到数组原型。
Array.prototype.sum = function(){ var sum = 0; this.map(function(item){ sum += item; }); return sum; }
那么你可以像这样在任何数组上使用它:
arr.sum();