3 votes

Extraire l'attribut d'objet d'une liste d'objets en Javascript

J'ai l'objet suivant que je reçois d'une API:

{
   '2012-12-12': [
       { 'id': 1234,
         'type': 'A' },
       { 'id': 1235,
         'type': 'A' },
       { 'id': 1236,
         'type': 'B' },
    ],
   '2012-12-13': [
       { 'id': 1237,
         'type': 'A' },
       { 'id': 1238,
         'type': 'C' },
       { 'id': 1239,
         'type': 'B' },
    ]
}

Ensuite, je veux avoir une autre variable nommée types de type Array qui contiendra chaque valeur possible de l'attribut type de chacun des objets. Dans ce cas, cela serait:

types = ['A', 'B', 'C']

Je tente de le faire de manière fonctionnelle (j'utilise underscore.js) mais je n'arrive pas à trouver une manière de le faire. Actuellement, j'utilise

types = [];
_.each(response, function(arr1, key1) {
    _.each(arr1, function(arr2, key2) {
        types.push(arr2.type);
    });
});
types = _.uniq(types);

Mais c'est très moche. Pouvez-vous m'aider à trouver une meilleure façon d'écrire ce code?

Merci!

5voto

Jan Dvorak Points 14371

Cela devrait fonctionner:

types = _.chain(input) // enable chaining
  .values()            // object to array
  .flatten()           // 2D array to 1D array
  .pluck("type")       // pick one property from each element
  .uniq()              // only the unique values
  .value()             // get an unwrapped array

Fiddle: http://jsfiddle.net/NFSfs/

Bien sûr, vous pouvez supprimer tous les espaces si vous le souhaitez:

types = _.chain(input).values().flatten().pluck("type").uniq().value()

ou sans chaînage:

types = _.uniq(_.pluck(_.flatten(_.values(input)),"type"));

flatten semble fonctionner sur les objets, même si la documentation indique clairement qu'il ne le devrait pas. Si vous souhaitez coder par rapport à l'implémentation, vous pouvez omettre l'appel à values, mais je ne le recommande pas. L'implémentation pourrait changer un jour, laissant votre code mystérieusement cassé.

1voto

the system Points 5563

Si vous voulez juste un code plus court, vous pourriez aplatir les objets dans un seul tableau, puis mapper ce tableau.

var types = _.unique(_.map(_.flatten(_.toArray(response)), function(arr) {
    return arr.type;
}));

Voici une autre version. Principalement par curiosité.

var types = _.unique(_.pluck(_.reduce(response, _.bind(Function.apply, [].concat), []), "type"));

En voici une autre.

var types = _.unique(_.reduce(response, function(acc, arr) {
    return acc.concat(_.pluck(arr,"type"));
}, []));

Et une autre.

var types = _.unique(_.pluck([].concat.apply([], _.toArray(response)), "type"))

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