Comment puis-je transformer un gros object
en array
avec lodash?
var obj = {
22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}
// transform to
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]
javascript
arrays
object
lodash
siavolt
la source
la source
Réponses:
Tu peux faire
Pour la documentation, voir ici.
la source
id
propriété n'existait pas et que vous vouliez la créer en fonction de la clé de chaque objet.var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
return
valeur dans un tableau comme celui-ci:const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });
j'apprécierais tous les commentaires ou suggestions pour améliorer cette approche.const toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
Sorties comme:
la source
toArray
il n'y a aucun moyen de conserver les clés si nécessaire.Une solution native moderne si quelqu'un est intéressé:
ou (pas IE):
la source
Object.keys(obj).map(key=>({key,value: obj[key]}))
const arr = Object.keys(obj).map(id => ({ id, ...obj[id] }));
cela amènerait l'objet entier dans les données renvoyées non? (en utilisant 'id' puisque le demandeur d'origine voulait stocker sa clé comme accessoire d'identité)Pour moi, cela a fonctionné:
Ça tourne
dans
la source
_.map(data, (v,k)=>({[k]: v}))
voir ma réponse pour plus de détails._.toPairs
et_fromPairs
est supplémentaire et inutile ici.[{key: 'someKey', val: 'The value'}, {....},...]
Il existe plusieurs façons d'obtenir le résultat que vous recherchez. Permet de les diviser en catégories:
Valeurs ES6 uniquement :
La méthode principale pour cela est Object.values . Mais en utilisant Object.keys et Array.map, vous pouvez également obtenir le résultat attendu:
Afficher l'extrait de code
Clé et valeur ES6 :
En utilisant la carte et les propriétés dynamiques / calculées ES6 et la déstructuration, vous pouvez conserver la clé et renvoyer un objet à partir de la carte.
Afficher l'extrait de code
Valeurs Lodash uniquement :
La méthode conçue pour cela est
_.values
cependant qu'il existe des "raccourcis" comme_.map
et la méthode utilitaire_.toArray
qui renverrait également un tableau contenant uniquement les valeurs de l'objet. Vous pouvez également utiliser_.map
le_.keys
et obtenir les valeurs de l'objet en utilisant laobj[key]
notation.Remarque: une
_.map
fois passé, un objet utilise sonbaseMap
gestionnaire qui est essentiellementforEach
sur les propriétés de l'objet.Afficher l'extrait de code
Clé et valeur Lodash :
Afficher l'extrait de code
Notez que dans les exemples ci-dessus, ES6 est utilisé (fonctions fléchées et propriétés dynamiques). Vous pouvez utiliser lodash
_.fromPairs
et d'autres méthodes pour composer un objet si ES6 est un problème.la source
Si vous voulez que la clé (id dans ce cas) soit préservée en tant que propriété de chaque élément du tableau, vous pouvez le faire
la source
Mise à jour 2017: Object.values , lodash values et toArray le font. Et pour conserver la carte des touches et répartir l'opérateur, jouez bien:
la source
Transformer un objet en tableau avec du JavaScript brut (
ECMAScript-2016
)Object.values
:Si vous souhaitez également conserver les clés, utilisez
Object.entries
etArray#map
comme ceci:la source
var arr = _.map(obj)
Vous pouvez également utiliser la
_.map
fonction (des deuxlodash
etunderscore
) avecobject
, elle gérera ce cas en interne, itérera sur chaque valeur et clé avec votre iteratee, et finalement retournera un tableau. En fait, vous pouvez l'utiliser sans aucune itération (juste_.map(obj)
) si vous voulez juste un tableau de valeurs. L'avantage est que si vous avez besoin d'une transformation entre les deux, vous pouvez le faire en une seule fois.Exemple:
Afficher l'extrait de code
Cependant, si vous souhaitez transformer votre objet, vous pouvez le faire, même si vous devez conserver la clé, vous pouvez le faire (
_.map(obj, (v, k) => {...}
) avec un argument supplémentaire dansmap
, puis l'utiliser comme vous le souhaitez.Cependant, il existe d'autres solutions Vanilla JS à cela (comme chaque
lodash
solution devrait en être une version JS pure) comme:Object.keys
et puismap
les valeursObject.values
(dans ES-2017)Object.entries
puismap
chaque paire clé / valeur (dans ES-2017)for...in
boucle et utilise chaque clé pour feting des valeursEt beaucoup plus. Mais comme cette question est pour
lodash
(et en supposant que quelqu'un l'utilise déjà), vous n'avez pas besoin de beaucoup penser à la version, au support des méthodes et à la gestion des erreurs si celles-ci ne sont pas trouvées.Il existe d'autres solutions de lodash comme
_.values
(plus lisibles pour un objectif spécifique), ou obtenir des paires, puis une carte, etc. mais dans le cas où votre code a besoin de flexibilité pour que vous puissiez le mettre à jour à l'avenir car vous devez conserverkeys
ou transformer un peu les valeurs, la meilleure solution est d'en utiliser un_.map
comme indiqué dans cette réponse. Ce ne sera pas si difficile en termes de lisibilité également.la source
Objet à tableau
De toutes les réponses, je pense que celle-ci est la meilleure:
qui transforme:
à:
Tableau à objet
Pour reconstituer:
Pour reconstituer en gardant la clé dans la valeur:
Va donner:
Pour le dernier exemple, vous pouvez également utiliser lodash
_.keyBy(arr, 'key')
ou_.keyBy(arr, i => i.key)
.la source
Si vous souhaitez un mappage personnalisé (comme Array.prototype.map original) d'Object dans un Array, vous pouvez simplement utiliser
_.forEach
:Voir
lodash
doc de _.forEach https://lodash.com/docs/#forEachla source