关于javascript:使用jQuery的数组中的值的总和

Sum of values in an array using jQuery

本问题已经有最佳答案,请猛点这里访问。

我有一个包含一些值的数组,我想得到它们的和。示例如下:

1
var somearray = ["20","40","80","400"];

我想使用jquery求和这些值。在这个例子中,结果是540。


还要处理浮点数:

  • (旧)javascript:

    1
    2
    3
    4
    5
    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:

    1
    2
    3
    var arr = ["20.0","40.1","80.2","400.3"],
        sum = 0;
    arr.forEach(function(num){sum+=parseFloat(num) || 0;});

  • ES6:

    1
    2
    3
    var 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
    7
    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:查询:

    1
    2
    3
    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)


您不需要jquery。您可以使用for循环:

1
2
3
4
var total = 0;
for (var i = 0; i < someArray.length; i++) {
    total += someArray[i] << 0;
}

相关:

  • 如何求数字数组的和


您可以使用除IE8和更低版本以外的所有浏览器中都可用的reduce

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