it-swarm-pt.tech

Soma dos valores em uma matriz usando jQuery

Eu tenho uma matriz que contém alguns valores e quero obter sua soma. Aqui está o exemplo:

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

Eu quero somar esses valores usando jQuery. Neste exemplo, o resultado seria 540.

42
Aman Virk

Você não precisa de jQuery. Você pode fazer isso usando um loop for:

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

Relacionado:

53
Mark Byers

Para também manipular números de ponto flutuante:

  • (Mais antigo) 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);
    

    A redução () está disponível nas versões mais antigas do ECMAScript, a função da seta é o que torna esse ES6 específico.

    Estou passando 0 como o primeiro valor pv, então não preciso parseFloat em torno dele - ele sempre manterá o soma anterior, que sempre será numérica. Como o valor atual, cv, pode ser não numérico (NaN), usamos ||0 para ignorar esse valor na matriz. Isso é ótimo se você quiser dividir uma frase e obter a soma dos números contidos nela. Aqui está um exemplo mais detalhado:

    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;});
    

O que você faz acima:

  • capacidade de inserir qualquer tipo de valor na matriz; número ou sequência numérica (123 ou "123"), sequência ou número de ponto flutuante ("123.4" ou 123.4) ou mesmo texto (abc)
  • adiciona apenas os números válidos e/ou seqüências numéricas, negligenciando qualquer texto simples (por exemplo, [1, 'a', '2'] soma 3)
64
vol7ron

Você pode usar reduce, que funciona em todos os navegadores, exceto no IE8 e inferior.

["20","40","80","400"].reduce(function(a, b) {
    return parseInt(a, 10) + parseInt(b, 10);
})
28
Codler

Outro método, se eval for seguro e rápido:

eval(["10","20","30","40","50"].join("+"))
24
Praveen Vijayan

Se você deseja que seja um método jquery, pode fazê-lo assim:

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

e chame assim:

var sum = $.sum(["20", "40", "80", "400"]);
10
gion_13
 var total = 0; 
 $. each (algumaArray, função () {
 total + = parseInt (this, 10); 
}); 
 
5
Sudhir Bastakoti

Você pode fazer desta maneira.

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

somearray = somearray.map(Number);

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

console.log(total);
4
RIYAJ KHAN

Em http://bugs.jquery.com/ticket/1886 torna-se óbvio que os desenvolvedores do jQuery têm sérios problemas mentais. programação funcional inspirou adições. De alguma forma, é bom ter algumas coisas fundamentais (como mapa), mas outras (como reduzir), a menos que reduza o tamanho geral do arquivo do jQuery. Vai saber.

Felizmente, alguém colocou o código para usar a função normal de redução para matrizes jQuery:

$ .fn.reduce = [] .reduce;

Agora podemos usar uma função simples de redução para criar uma soma:

//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)

Por fim, como alguns navegadores mais antigos ainda não implementaram a redução, um polyfill pode ser retirado de MDN (é grande, mas acho que tem exatamente o mesmo comportamento, o que é desejável):

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;
      };
    }
4
Lodewijk
    var arr = ["20.0","40.1","80.2","400.3"],
    sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0; });

Funcionou perfeitamente para o que eu precisava. Graças vol7ron

1
Annunaki