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.
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]
}));
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');
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.
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;
});
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);
pour ES6, c'est
var some_map = _.chain(some_object_array)
.map(item => [item.id, item])
.object()
.value()