Underscore.js - gamme de cartes de paires clé/valeur à un Objet - Un liner
J'ai été en passant par la trait de soulignement docs mais je n'arrive pas à trouver une méthode (ou imbriqués à l'appel de la méthode) pour faire de la transformation suivante:
Disons que j'ai le code Javascript suivant tableau:
[{ "name" : "sEcho", "value" : 1},{ "name" : "iColumns", "value" : 12}, ... ]
Et j'ai besoin de la transformer en l'objet suivant:
{
sEcho: 1,
iColumns: 12,
...
}
Je suis en utilisant underscore.js pour une raison donc, il doit être une doublure.
- Une ligne?
_.map(arr,function(v,o){o={};return o[v.name]=v.value,o });
Ne sais pas si il y a une façon plus simple de le faire... - Créer un tableau d'objets. Vous voulez seulement un objet.
- À droite, j'ai mal compris alors...
Vous devez vous connecter pour publier un commentaire.
Puisque personne n'a posté une réponse, je poste parce que je pense que c'est mieux que Jan réponse. C'est plus court et propre, et sans la fonction inline.
pluck
's etmap
résulte de l', de sorte que même si cela fonctionne dans les navigateurs actuels, je ne voudrais pas compter sur elle. Imaginez combien il serait de repérer un bug où les valeurs sont affectées aux touches mal.{sEcho:12, iColumns:1}
au lieu du résultat attendu. C'est pourquoi je préfère faire la clé-valeur de cartographie en une seule opération, commereduce
oumap
pluck
,map
, etobject
fonctions sont toutes d'exploitation sur les tableaux, où l'ordre est garanti, donc il n'y a pas de problème.Variation sur Sza réponse, à l'aide du tableau de paires" la signature de
_.object
:_.object(_.map(data, (x) => {return [x.name, x.value]}))
_.object(_pluck(data, 'name'), _.pluck(data, 'value'))
_.object([o.name, o.value] for o in data)
_.chain
fonction : gist.github.com/ablanchet/f8b9c3ece0812ebf3f3cCela devrait le faire:
Comme un one-liner (vous moquez de moi, non?):
b.value
valeurs? Pourquoi pas un simplea[b.name] = b.value
?_(a).reduce(function(m, h) { return m[h.name] = h.value, m }, { })
. Heh.Disons que vous avez un tableau JavaScript:
Vous pouvez le convertir dans le format que vous voulez comme suit:
Ce n'est pas une seule ligne, mais je ne pense pas que vous signifie littéralement en une seule ligne. Le saviez vous?
Voici en une seule ligne si vous voulait vraiment dire un liner:
Oui, d'autres ont fourni la même réponse. Cependant, c'est seulement parce que la réponse à votre question est donc simple.
endroit idéal pour une utilisation à réduire je pense:
_.reduce(ary, function(memo, obj){ memo[obj["name"]] = obj["value"]; return memo }, {});
ES6
ES5
Cette itération de deux fois si