Somme des valeurs dans un tableau en utilisant jQuery

J'ai un tableau contenant certaines valeurs et je veux obtenir leur somme. Voici l'exemple:

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

Je veux résumer ces valeurs en utilisant jQuery. Dans cet exemple, le résultat serait 540.

Vous n'avez pas besoin de jQuery. Vous pouvez le faire en utilisant une boucle for :

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

En relation:

  • Comment trouver la somme d'un tableau de nombres

Pour gérer également les nombres à virgule flottante:

  • (Plus ancien) 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); 

    Le réduit () est disponible dans les anciennes versions ECMAScript, la fonction flèche est ce qui rend ES6 spécifique.

    Je passe en 0 en tant que première valeur de pv , donc je n'ai pas besoin de ParseFloat autour de lui – il tiendra toujours la somme précédente, qui sera toujours numérique. Parce que la valeur actuelle, cv , peut être non numérique ( NaN ), nous utilisons ||0 pour sauter cette valeur dans le tableau. C'est formidable si vous voulez rompre une phrase et obtenir la somme des nombres. Voici un exemple plus détaillé:

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

Qu'est-ce qui précède:

  • Capacité d'entrer n'importe quel type de valeur dans le tableau; Nombre ou chaîne numérique ( 123 ou "123" ), chaîne flottante ou numéro ( "123.4" ou 123.4 ), ou même texte ( abc )
  • N'ajoute que les nombres valides et / ou les chaînes numériques, en négligeant tout texte nu (par exemple, [1, 'a', '2'] à 3)

Vous pouvez utiliser la reduce qui fonctionne dans tous les navigateurs sauf IE8 et plus bas.

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

Une autre méthode, si eval est sécurisé et rapide:

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

Si vous voulez qu'il s'agisse d'une méthode jquery, vous pouvez le faire comme ceci:

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

Et appelez-le comme ceci:

 var sum = $.sum(["20", "40", "80", "400"]); 
 Var total = 0;
 $ .each (someArray, function () {
     Total + = parseInt (ceci, 10);
 });

Dans http://bugs.jquery.com/ticket/1886, il devient évident que les développeurs jQuery ont des problèmes mentaux sérieux. Programmation fonctionnelle ajouts inspirés. D'une manière ou d'une autre, il est bon d'avoir des éléments fondamentaux (comme la carte), mais pas d'autres (comme réduire), à ​​moins qu'il ne réduise le fichier général de jQuery. Allez comprendre.

Avec aide, quelqu'un a placé le code pour utiliser la fonction de réduction normale pour les tableaux jQuery:

$ .fn.reduce = [] .reduce;

Maintenant, nous pouvons utiliser une fonction de réduction simple pour créer une sommation:

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

Enfin, comme certains navigateurs plus anciens n'avaient pas encore été mis en œuvre, un polyfill peut être extrait de MDN (c'est grand, mais je suppose qu'il a exactement le même comportement, ce qui est souhaitable):

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

Vous pouvez le faire de cette façon.

 var somearray = ["20","40","80","400"]; somearray = somearray.map(Number); var total = somearray.reduce(function(a,b){ return a+b },0) console.log(total); 
  var arr = ["20.0","40.1","80.2","400.3"], sum = 0; $.each(arr,function(){sum+=parseFloat(this) || 0; }); 

J'ai travaillé parfaitement pour ce dont j'avais besoin. Merci vol7ron