J'ai un tableau contenant des 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:
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);
La réduction () est disponible dans les anciennes versions d’ECMAScript, c’est la fonction flèche qui rend cette ES6 spécifique.
Je passe en 0 la première valeur pv
, donc je n'ai pas besoin de parseFloat - cela tiendra toujours la somme précédente, qui sera toujours numérique. Comme la valeur actuelle, cv
, peut être non numérique (NaN
), nous utilisons ||0
sur elle pour ignorer cette valeur dans le tableau. C'est formidable si vous voulez diviser une phrase et obtenir la somme des nombres qu'elle contient. 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 que ci-dessus vous obtient:
123
ou "123"
), chaîne en virgule flottante ou nombre ("123.4"
ou 123.4
), ou même du texte (abc
)Vous pouvez utiliser reduce
qui fonctionne dans tous les navigateurs sauf IE8 et les versions antérieures.
["20","40","80","400"].reduce(function(a, b) {
return parseInt(a, 10) + parseInt(b, 10);
})
Une autre méthode, si eval est sûre et rapide:
eval(["10","20","30","40","50"].join("+"))
Si vous voulez que ce soit 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 comme ça:
var sum = $.sum(["20", "40", "80", "400"]);
var total = 0; $. each (someArray, function () { total + = parseInt (this, 10); });
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);
Dans http://bugs.jquery.com/ticket/1886 , il devient évident que les développeurs jQuery ont de graves problèmes mentaux reg. programmation fonctionnelle inspirée additions. En quelque sorte, il est bon d’avoir des éléments fondamentaux (tels que map), mais pas d’autres (tels que réduire), sauf s’ils réduisent la taille de fichier globale de jQuery. Allez comprendre.
Heureusement, quelqu'un a placé du code pour utiliser la fonction de réduction normale pour les tableaux jQuery:
$ .fn.reduce = [] .reduce;
Nous pouvons maintenant utiliser une simple fonction de réduction pour créer une somme:
//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 implémenté une réduction, un polyfill peut être pris de [~ # ~] mdn [~ # ~] (c’est gros 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;
};
}
var arr = ["20.0","40.1","80.2","400.3"],
sum = 0;
$.each(arr,function(){sum+=parseFloat(this) || 0; });
A parfaitement fonctionné pour ce dont j'avais besoin. Merci vol7ron