使用jQuery的数组中的值总和[重复]
Posted
技术标签:
【中文标题】使用jQuery的数组中的值总和[重复]【英文标题】:Sum of values in an array using jQuery [duplicate] 【发布时间】:2012-01-22 22:12:21 【问题描述】:我有一个包含一些值的数组,我想得到它们的总和。这是一个例子:
var somearray = ["20","40","80","400"];
我想使用 jQuery 对这些值求和。在本例中,结果为 540。
【问题讨论】:
【参考方案1】:还要处理浮点数:
(旧版)JavaScript:
var 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:
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
arr.forEach(function(num)sum+=parseFloat(num) || 0;);
ES6:
var sum = ["20.0","40.1","80.2","400.3"].reduce((pv,cv)=>
return pv + (parseFloat(cv)||0);
,0);
reduce() 在较旧的 ECMAScript 版本中可用,箭头函数是 ES6 特有的。
我将 0 作为第一个 pv
值传入,所以我不需要 parseFloat 围绕它 - 它会始终保存前一个总和,它始终是数字。因为当前值 cv
可以是非数字 (NaN
),所以我们在其上使用 ||0
以跳过数组中的该值。如果您想拆分一个句子并获得其中数字的总和,这非常棒。这是一个更详细的示例:
let 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:
var 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)
【讨论】:
我会像这样加倍:) @AntonSemenichenko 这仍然存在浮点运算等已知的原生缺陷,因此请谨慎操作:)【参考方案2】:你不需要 jQuery。您可以使用for
循环来执行此操作:
var total = 0;
for (var i = 0; i < someArray.length; i++)
total += someArray[i] << 0;
相关:
How to find the sum of an array of numbers【讨论】:
您不应将for(x in someArray)
与数组一起使用,因为它会枚举数组的可枚举属性,而不仅仅是数组元素。你应该在数组上使用for (var i = 0; i < someArray.length; i++)
。
@jfriend00:谢谢!修好了。
次要:缓存长度字段,因此不必检查每次迭代; for (var i = 0, len = someArray.length; i < len; i++)
@MarkByers <<
代表什么?
@BeNdErR 和@RIYAJKHAN,左移<<
用于将字符串元素转换为数字,以便它们可以添加而不是连接。【参考方案3】:
您可以使用reduce
,它适用于除 IE8 及更低版本之外的所有浏览器。
["20","40","80","400"].reduce(function(a, b)
return parseInt(a, 10) + parseInt(b, 10);
)
【讨论】:
你不需要parseInt(a)
,因为a
是之前的reduce
返回,它已经是一个数字了。好吧,除了第一次调用,但是你可以添加 0
作为参数来减少,这没关系。
这是最接近我想要的。那么.. jQuery 是否有独立于浏览器的 reduce(比如下划线?)? bugs.jquery.com/ticket/1886 - 天哪,这真是太愚蠢了【参考方案4】:
另一种方法,如果 eval 安全且快速:
eval(["10","20","30","40","50"].join("+"))
【讨论】:
这是一个非常奇怪的解决方案。我不知道它的性能,这很奇怪。附带说明:如果可以,请不要使用 eval。 一般来说,真的不推荐使用 eval,因为很少有人能保证它是安全的,而且(我猜)它也不会比 reduce 快(很多)。 为什么“从不使用 eval”?我必须在上一份合同中使用它,因为我们将 JSON 中的函数作为字符串存储在数据库中(我没有设计它)。有时这是合适的解决方案。【参考方案5】:如果你希望它是一个 jquery 方法,你可以这样做:
$.sum = function(arr)
var r = 0;
$.each(arr, function(i, v)
r += +v;
);
return r;
然后这样称呼它:
var sum = $.sum(["20", "40", "80", "400"]);
【讨论】:
不错。我喜欢你的方法。 更改为r += parseInt(v);
,因为"20"
是字符串而不是整数。
或parseFloat(v)
【参考方案6】:
变量总计 = 0;
$.each(someArray,function()
总计 += parseInt(this, 10);
);
【讨论】:
海报将每个元素作为字符串加载,因此您要么需要parseInt
、parseFloat
,要么乘以 1。
也可以在里面加一个map来分隔parseInt,但不要觉得有多大的收获【参考方案7】:
在http://bugs.jquery.com/ticket/1886 中,很明显 jQuery 开发人员有严重的心理问题。函数式编程启发了添加。不知何故,拥有一些基本的东西(比如 map)而不是其他的东西(比如 reduce)是件好事,除非它减少了 jQuery 的整体文件大小。去图吧。
有帮助的是,有人放置了代码来使用 jQuery 数组的普通 reduce 函数:
$.fn.reduce = [].reduce;
现在我们可以使用一个简单的 reduce 函数来创建求和:
//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(它很大,但我想它具有完全相同的行为,这是可取的):
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;
;
【讨论】:
感谢您提供重用 Array.reduce 的超简单解决方案。它对我很有用!【参考方案8】:你可以这样做。
var somearray = ["20","40","80","400"];
somearray = somearray.map(Number);
var total = somearray.reduce(function(a,b) return a+b ,0)
console.log(total);
【讨论】:
IE8 不支持。如果数组为空也会引发错误,最好使用.reduce(function(a,b) return a+b; , 0)
,它在空数组上安全地返回 0。
谢谢@BeniCherniavsky-Paskin。我已经更新了我的答案【参考方案9】:
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function()sum+=parseFloat(this) || 0; );
完美地满足我的需要。谢谢vol7ron
【讨论】:
以上是关于使用jQuery的数组中的值总和[重复]的主要内容,如果未能解决你的问题,请参考以下文章