web-dev-qa-db-fra.com

Underscore.js: créer une carte à partir de la liste des objets à l'aide d'une clé trouvée dans l'objet

J'utilise l'excellente bibliothèque nderscore.js . J'ai une tâche spécifique que je peux bien faire en utilisant JavaScript ou jQuery mais je me demandais s'il y avait une sorte d'abstraction disponible dans Underscore que je manquais.

Essentiellement, j'ai un objet comme ça -

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

Je veux convertir cela en -

var some_map = {"a": {id: "a", val: 55}, "b": {id: "b", val: 1}, "c": {id: "c", val: 45}};

Je sais que je peux utiliser _.groupBy(some_object_array, "id"). Mais cela renvoie une carte comme ça -

var some_grouped_map = {"a": [{id: "a", val: 55}], "b": [{id: "b", val: 1}], "c": [{id: "c", val: 45}]};

Notez que cela fait ce pour quoi il est annoncé. Mais j'espérais obtenir some_map Sans itérer sur les objets moi-même.

Toute aide appréciée.

58
Chantz

Pour ce que ça vaut, puisque underscore.js vous pouvez maintenant utiliser _.object()

var some_map = _.object(_.map(some_object_array, function(item) {
   return [item.id, item]
}));
88
cletus

pour votre cas, vous devez utiliser la fonction indexBy:

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

var some_grouped_map = _.indexBy(some_object_array, 'id');
46
user3699395

Il y a aussi cette méthode

_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})

Qui est une instruction avec deux instructions dans la fonction interne.

30

Je ne pense pas qu'il y ait quelque chose de plus proche que groupBy pour vos besoins. Même s'il y en avait, cela ne ferait pas mieux qu'un simple:

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});
13
Marwane K.A.

Dans ce cas, vous n'avez pas besoin d'itérer le tableau. Pas map, pas reduce, pas transform. Tout ce dont vous avez besoin est l'ancien pluck

_.object(_.pluck(some_object_array, 'id'), some_object_array);
3
AA.

pour ES6, c'est

var some_map = _.chain(some_object_array)
                .map(item => [item.id, item])
                .object()
                .value()
2
ryan