使用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 &lt; someArray.length; i++) @jfriend00:谢谢!修好了。 次要:缓存长度字段,因此不必检查每次迭代; for (var i = 0, len = someArray.length; i &lt; len; i++) @MarkByers &lt;&lt; 代表什么? @BeNdErR 和@RIYAJKHAN,左移&lt;&lt; 用于将字符串元素转换为数字,以便它们可以添加而不是连接。【参考方案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); );

【讨论】:

海报将每个元素作为字符串加载,因此您要么需要parseIntparseFloat,要么乘以 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的数组中的值总和[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从jquery中的给定对象数组中打印用户名[重复]

从列表中获取总和为值的元素数组[重复]

从表的两行到视图中的值总和[重复]

检查使用jquery选择文本框中的值[重复]

查询父项时如何获取猫鼬子文档数组中的值的聚合总和?

jquery如何去掉下拉框中重复的值