143 votes

Comment additionner les valeurs d'un objet JavaScript ?

Je voudrais faire la somme des valeurs d'un objet.

J'ai l'habitude de python où ce serait juste :

sample = { 'a': 1 , 'b': 2 , 'c':3 };
summed =  sum(sample.itervalues())     

Le code suivant fonctionne, mais c'est beaucoup de code :

function obj_values(object) {
  var results = [];
  for (var property in object)
    results.push(object[property]);
  return results;
}

function list_sum( list ){
  return list.reduce(function(previousValue, currentValue, index, array){
      return previousValue + currentValue;
  });
}

function object_values_sum( obj ){
  return list_sum(obj_values(obj));
}

var sample = { a: 1 , b: 2 , c:3 };
var summed =  list_sum(obj_values(a));
var summed =  object_values_sum(a)

Est-ce que j'ai raté quelque chose d'évident, ou est-ce que c'est juste comme ça ?

176voto

Gothdo Points 4842

Cela peut être aussi simple que cela :

const sumValues = obj => Object.values(obj).reduce((a, b) => a + b);

Je cite MDN :

El Object.values() renvoie un tableau de valeurs de propriétés énumérables propres à un objet donné, dans le même ordre que celui fourni par un objet de type for...in (la différence étant qu'une boucle for-in énumère également les propriétés de la chaîne de prototypes).

de <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values" rel="noreferrer"><code>Object.values()</code> sur MDN</a>

El reduce() applique une fonction à un accumulateur et à chaque valeur du tableau (de gauche à droite) pour le réduire à une seule valeur.

de <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce" rel="noreferrer"><code>Array.prototype.reduce()</code> sur MDN</a>

Vous pouvez utiliser cette fonction comme ça :

sumValues({a: 4, b: 6, c: -5, d: 0}); // gives 5

Notez que ce code utilise certaines fonctionnalités ECMAScript qui ne sont pas prises en charge par certains anciens navigateurs (comme IE). Vous devrez peut-être utiliser Babel pour compiler votre code.

97voto

Sirko Points 32515

Vous pourriez tout mettre dans une seule fonction :

function sum( obj ) {
  var sum = 0;
  for( var el in obj ) {
    if( obj.hasOwnProperty( el ) ) {
      sum += parseFloat( obj[el] );
    }
  }
  return sum;
}

var sample = { a: 1 , b: 2 , c:3 };
var summed = sum( sample );
console.log( "sum: "+summed );

Pour le plaisir, voici une autre implémentation utilisant Object.keys() y Array.reduce() (la prise en charge des navigateurs ne devrait plus être un gros problème) :

function sum(obj) {
  return Object.keys(obj).reduce((sum,key)=>sum+parseFloat(obj[key]||0),0);
}
let sample = { a: 1 , b: 2 , c:3 };

console.log(`sum:${sum(sample)}`);

Mais ceci semble être beaucoup plus lent : jsperf.com

31voto

Leon Points 356

Si vous utilisez lodash vous pouvez faire quelque chose comme

_.sum(_.values({ 'a': 1 , 'b': 2 , 'c':3 }))

29voto

Krishnadas PC Points 1692

Vous pouvez désormais utiliser reduce et obtenir la somme.

const object1 = { 'a': 1 , 'b': 2 , 'c':3 }

console.log(Object.values(object1).reduce((a, b) => a + b, 0));

24voto

Blender Points 114729

Un régulier for La boucle est assez concise :

var total = 0;

for (var property in object) {
    total += object[property];
}

Vous devrez peut-être ajouter object.hasOwnProperty si vous avez modifié le prototype.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X