给定一个数组[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)
)
为什么不减少?它通常有点反直觉,但使用它来查找总和非常简单:
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
-variable.
var array = [1, 2, 3]; for (var i = 0, sum = 0; i < array.length; sum += array[i++]);
JavaScript不知道块作用域,因此sum
可以访问:
console.log(sum); // => 6
与上面相同,但注释和准备为一个简单的功能:
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; }
如果你碰巧使用Lodash,你可以使用sum函数
array = [1, 2, 3, 4]; sum = _.sum(array); // sum == 10
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.57毫秒/运行(在100个随机正常数字的阵列上测量1000次运行),相比之下,使用上述eval()
方法运行3.604毫秒/运行,运行标准为2.151毫秒/ (i,长度,++ )循环.
方法说明:此测试是在Google Apps脚本服务器上运行的,因此他们的javascript引擎与Chrome几乎完全相同.
编辑:--i
代替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
有趣的方法:
eval([1,2,3].join("+"))
好吧,想象一下下面有这个数组:
const arr = [1, 2, 3, 4];
让我们开始研究许多不同的方法,因为我在这里找不到任何全面的答案:
1)使用内置的reduce()
function total(arr) { if(!Array.isArray(arr)) return; return arr.reduce((a, v)=>a + v); }
2)使用for循环
function total(arr) { if(!Array.isArray(arr)) return; let totalNumber = 0; for (let i=0,l=arr.length; i3)使用while循环
function total(arr) { if(!Array.isArray(arr)) return; let totalNumber = 0, i=-1; while (++i < arr.length) { totalNumber+=arr[i]; } return totalNumber; }4)使用array forEach
function total(arr) { if(!Array.isArray(arr)) return; let sum=0; arr.forEach(each => { sum+=each; }); return sum; };并称之为:
total(arr); //return 10不建议将这样的原型原型化为Array ...
13> geek-merlin..:有人在寻找像我一样的功能性oneliner吗?拿着这个:
sum= arr.reduce(function (a, b) {return a + b;}, 0);
14> 小智..:标准的JavaScript解决方案:
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).我希望这种解决方案没有隐藏的劣势.
15> 小智..:我是JavaScript和编码的初学者,但我发现在数组中对数字求和的简单方法就像这样:
var myNumbers = [1,2,3,4,5] var total = 0; for(var i = 0; i < myNumbers.length; i++){ total += myNumbers[i]; }基本上,我想做出贡献,因为我没有看到许多不使用内置函数的解决方案,而且这种方法易于编写和理解.
16> user40521..:var totally = eval(arr.join('+'))这样你就可以在阵列中放置各种奇特的东西.
var arr = ['(1/3)','Date.now()','foo','bar()',1,2,3,4]我只是半开玩笑.
我笑了一半
17> 小智..:一小段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)