262 votes

Javascript reduce() sur un objet

Il existe une belle méthode Array reduce() pour obtenir une valeur du tableau. Exemple :

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
});

Quelle est la meilleure façon d'obtenir la même chose avec des objets ? J'aimerais faire ceci :

{ 
    a: {value:1}, 
    b: {value:2}, 
    c: {value:3} 
}.reduce(function(previous, current, index, array){
  return previous.value + current.value;
});

Cependant, l'objet ne semble pas avoir reduce() méthode mise en œuvre.

5voto

1 :

[{value:5}, {value:10}].reduce((previousValue, currentValue) => { return {value: previousValue.value + currentValue.value}})

>> Object {value: 15}

2 :

[{value:5}, {value:10}].map(item => item.value).reduce((previousValue, currentValue) => {return previousValue + currentValue })

>> 15

3 :

[{value:5}, {value:10}].reduce(function (previousValue, currentValue) {
      return {value: previousValue.value + currentValue.value};
})

>> Object {value: 15}

4voto

Igor Sukharev Points 101

Un objet peut être transformé en tableau avec : Objet.entries() , Objet.keys() , Objet.valeurs() et ensuite être réduit comme un tableau. Mais on peut aussi réduire un objet sans créer le tableau intermédiaire.

J'ai créé une petite bibliothèque d'aide odict pour travailler avec des objets.

npm install --save odict

Il a reduce qui fonctionne de manière très similaire à Array.prototype.reduce() :

export const reduce = (dict, reducer, accumulator) => {
  for (const key in dict)
    accumulator = reducer(accumulator, dict[key], key, dict);
  return accumulator;
};

Vous pouvez également l'attribuer à :

Object.reduce = reduce;

car cette méthode est très utile !

Donc la réponse à votre question serait :

const result = Object.reduce(
  {
    a: {value:1},
    b: {value:2},
    c: {value:3},
  },
  (accumulator, current) => (accumulator.value += current.value, accumulator), // reducer function must return accumulator
  {value: 0} // initial accumulator value
);

3voto

user1247458 Points 79

Étendre Object.prototype.

Object.prototype.reduce = function( reduceCallback, initialValue ) {
    var obj = this, keys = Object.keys( obj );

    return keys.reduce( function( prevVal, item, idx, arr ) {
        return reduceCallback( prevVal, item, obj[item], obj );
    }, initialValue );
};

Exemple d'utilisation.

var dataset = {
    key1 : 'value1',
    key2 : 'value2',
    key3 : 'value3'
};

function reduceFn( prevVal, key, val, obj ) {
    return prevVal + key + ' : ' + val + '; ';
}

console.log( dataset.reduce( reduceFn, 'initialValue' ) );
'Output' == 'initialValue; key1 : value1; key2 : value2; key3 : value3; '.

n'Joy it, les gars !! ;-)

2voto

Janus Troelsen Points 5121

Vous pouvez utiliser une expression génératrice (prise en charge dans tous les navigateurs depuis des années, et dans Node) pour obtenir les paires clé-valeur dans une liste sur laquelle vous pouvez effectuer des réductions :

>>> a = {"b": 3}
Object { b=3}

>>> [[i, a[i]] for (i in a) if (a.hasOwnProperty(i))]
[["b", 3]]

1voto

kennebec Points 33886

Si vous pouvez utiliser un tableau, utilisez-le, la longueur et l'ordre d'un tableau valent la moitié de sa valeur.

function reducer(obj, fun, temp){
    if(typeof fun=== 'function'){
        if(temp== undefined) temp= '';
        for(var p in obj){
            if(obj.hasOwnProperty(p)){
                temp= fun(obj[p], temp, p, obj);
            }
        }
    }
    return temp;
}
var O={a:{value:1},b:{value:2},c:{value:3}}

reducer(O, function(a, b){return a.value+b;},0);

/* Valeur retournée : (Nombre) 6 */

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