Sum of values in an array using jQuery
本问题已经有最佳答案,请猛点这里访问。
我有一个包含一些值的数组,我想得到它们的和。示例如下:
1 | var somearray = ["20","40","80","400"]; |
我想使用jquery求和这些值。在这个例子中,结果是540。
还要处理浮点数:
(旧)javascript:
1
2
3
4
5var arr = ["20.0","40.1","80.2","400.3"],
n = arr.length,
sum = 0;
while(n--)
sum += parseFloat(arr[n]) || 0;ECMA 5.1/6:
1
2
3var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
arr.forEach(function(num){sum+=parseFloat(num) || 0;});。
ES6:
1
2
3var sum = ["20.0","40.1","80.2","400.3"].reduce((pv,cv)=>{
return pv + (parseFloat(cv)||0);
},0);reduce()在较旧的ecmascript版本中可用,arrow函数使这个es6特定。
我将0作为第一个
pv 值传入,因此不需要在它周围进行parsefloat-它将始终保持前一个和,它始终是数字。由于当前值cv 可以是非数字(NaN ),因此我们在它上面使用||0 跳过数组中的该值。如果你想分解一个句子并求出其中的数字之和,那就太好了。下面是一个更详细的示例:1
2
3
4
5
6
7let num_of_fruits = `
This is a sentence where 1.25 values are oranges
and 2.5 values are apples. How many fruits are
there?
`.split(/\s/g).reduce((p,c)=>p+(parseFloat(c)||0), 0);
// num_of_fruits == 3.75。
jquery:查询:
1
2
3var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0;});。
上面的内容让您:
- 能够在数组中输入任何类型的值;数字或数字字符串(
123 或"123" 、浮点字符串或数字("123.4" 或123.4 或偶数文本(abc ) - 只添加有效数字和/或数字字符串,忽略任何纯文本(例如[1,'a','2']和为3)
您不需要jquery。您可以使用
1 2 3 4 | var total = 0; for (var i = 0; i < someArray.length; i++) { total += someArray[i] << 0; } |
相关:
- 如何求数字数组的和
您可以使用除IE8和更低版本以外的所有浏览器中都可用的
1 2 3 | ["20","40","80","400"].reduce(function(a, b) { return parseInt(a, 10) + parseInt(b, 10); }) |
另一种方法,如果eval是安全和快速的:
1 | eval(["10","20","30","40","50"].join("+")) |
。
如果希望它是jquery方法,可以这样做:
1 2 3 4 5 6 7 | $.sum = function(arr) { var r = 0; $.each(arr, function(i, v) { r += +v; }); return r; } |
这样称呼它:
1 | var sum = $.sum(["20","40","80","400"]); |
。
1 2 3 4 | var total = 0; $.each(someArray,function() { total += parseInt(this, 10); }); |
号
在http://bugs.jquery.com/ticket/1886中,很明显jquery devs有严重的心理问题。函数式编程启发的补充。不知何故,拥有一些基本的东西(如map)而不是其他的东西(如reduce)是很好的,除非它减少了jquery的整体文件大小。去想一想。
有用的是,有人为jquery数组放置了使用normal reduce函数的代码:
$.fn.reduce = [].reduce;
号
现在我们可以使用一个简单的reduce函数来创建求和:
1 2 3 | //where X is a jQuery array X.reduce(function(a,b){ return a + b; }); // (change"a" into parseFloat("a") if the first a is a string) |
号
最后,由于一些旧的浏览器还没有实现reduce,可以从MDN中提取polyfill(它很大,但我猜它具有完全相同的行为,这是可取的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | if ( 'function' !== typeof Array.prototype.reduce ) { Array.prototype.reduce = function( callback /*, initialValue*/ ) { 'use strict'; if ( null === this || 'undefined' === typeof this ) { throw new TypeError( 'Array.prototype.reduce called on null or undefined' ); } if ( 'function' !== typeof callback ) { throw new TypeError( callback + ' is not a function' ); } var t = Object( this ), len = t.length >>> 0, k = 0, value; if ( arguments.length >= 2 ) { value = arguments[1]; } else { while ( k < len && ! k in t ) k++; if ( k >= len ) throw new TypeError('Reduce of empty array with no initial value'); value = t[ k++ ]; } for ( ; k < len ; k++ ) { if ( k in t ) { value = callback( value, t[k], k, t ); } } return value; }; } |
号
你可以这样做。
1 2 3 4 5 6 7 | var somearray = ["20","40","80","400"]; somearray = somearray.map(Number); var total = somearray.reduce(function(a,b){ return a+b },0) console.log(total); |
号
1 2 3 | var arr = ["20.0","40.1","80.2","400.3"], sum = 0; $.each(arr,function(){sum+=parseFloat(this) || 0; }); |
号
为我所需要的完美工作。谢谢你,沃尔7ron