使用jQuery的数组中的值的总和

Ama*_*irk 42 javascript arrays jquery

我有一个包含一些值的数组,我想得到它们的总和.这是一个例子:

var somearray = ["20","40","80","400"];
Run Code Online (Sandbox Code Playgroud)

我想使用jQuery对这些值求和.在这个例子中,结果将是540.

vol*_*ron 64

要处理浮点数:

  • (旧)JavaScript:

    var arr = ["20.0","40.1","80.2","400.3"],
        n   = arr.length,
        sum = 0;
    while(n--)
       sum += parseFloat(arr[n]) || 0;
    
    Run Code Online (Sandbox Code Playgroud)
  • ECMA 5.1/6:

    var arr = ["20.0","40.1","80.2","400.3"],
        sum = 0;
    arr.forEach(function(num){sum+=parseFloat(num) || 0;});
    
    Run Code Online (Sandbox Code Playgroud)
  • ES6:

    var sum = ["20.0","40.1","80.2","400.3"].reduce((pv,cv)=>{
       return pv + (parseFloat(cv)||0);
    },0);
    
    Run Code Online (Sandbox Code Playgroud)

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • jQuery的:

    var arr = ["20.0","40.1","80.2","400.3"],
        sum = 0;
    $.each(arr,function(){sum+=parseFloat(this) || 0;});
    
    Run Code Online (Sandbox Code Playgroud)

以上是什么让你:

  • 能够将任何类型的值输入到数组中; 数字或数字字符串(123"123"),浮点字符串或数字("123.4"123.4),甚至文本(abc)
  • 只添加有效数字和/或数字字符串,忽略任何裸文本(例如[1,'a','2']总和为3)


Mar*_*ers 56

你不需要jQuery.您可以使用for循环执行此操作:

var total = 0;
for (var i = 0; i < someArray.length; i++) {
    total += someArray[i] << 0;
}
Run Code Online (Sandbox Code Playgroud)

有关:

  • 你不应该在数组中使用`for(x in someArray)`,因为它枚举了数组的可枚举属性,而不仅仅是数组元素.你应该在数组上使用`for(var i = 0; i <someArray.length; i ++)`. (7认同)
  • @MarkByers"<<"代表什么? (5认同)
  • Minor:缓存长度字段,这样就不必检查每次迭代; `for(var i = 0,len = someArray.length; i <len; i ++)` (2认同)

Cod*_*ler 29

您可以使用reduce哪个适用于IE8及更低版本以外的所有浏览器.

["20","40","80","400"].reduce(function(a, b) {
    return parseInt(a, 10) + parseInt(b, 10);
})
Run Code Online (Sandbox Code Playgroud)


Pra*_*yan 24

另一种方法,如果eval是安全和快速的:

eval(["10","20","30","40","50"].join("+"))
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常奇怪的解决方案.我不知道它的性能,这很奇怪.作为旁注:如果可以的话,请不要使用eval. (14认同)

gio*_*_13 11

如果你想让它成为一个jquery方法,你可以这样做:

$.sum = function(arr) {
    var r = 0;
    $.each(arr, function(i, v) {
        r += +v;
    });
    return r;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

var sum = $.sum(["20", "40", "80", "400"]);
Run Code Online (Sandbox Code Playgroud)


Sud*_*oti 5

var total = 0;
$.each(someArray,function() {
    total += parseInt(this, 10);
});


Lod*_*ijk 5

http://bugs.jquery.com/ticket/1886 中,很明显 jQuery 开发人员有严重的心理问题。函数式编程启发了添加。不知何故,拥有一些基本的东西(比如地图)而不是其他东西(比如减少)是好的,除非它减少了 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)
Run Code Online (Sandbox Code Playgroud)

最后,由于一些较旧的浏览器还没有实现 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;
      };
    }
Run Code Online (Sandbox Code Playgroud)


RIY*_*HAN 5

你可以这样做。

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

somearray = somearray.map(Number);

var total = somearray.reduce(function(a,b){  return a+b },0)

console.log(total);
Run Code Online (Sandbox Code Playgroud)