Je veux convertir un objet comme celui-ci:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
dans un tableau de paires clé-valeur comme ceci:
[[1,5],[2,7],[3,0],[4,0]...].
Comment puis-je convertir un objet en un tableau de paires clé-valeur en JavaScript?
javascript
arrays
type-conversion
Soptareanu Alex
la source
la source
NaN
place. Si vous souhaitez utiliser des chaînes comme clés, changez le retour de[Number(key), obj[key]]
en[key, obj[key]]
ou utilisez leObject.entries
comme @Pila suggéré dans leur réponseLa meilleure façon est de faire:
L'appel
entries
, comme indiqué ici, renverra des[key, value]
paires, comme l'a demandé le demandeur.Alternativement, vous pouvez appeler
Object.values(obj)
, qui ne renverra que des valeurs.la source
La
Object.entries
fonction renvoie presque la sortie exacte que vous demandez, sauf que les clés sont des chaînes au lieu de chiffres.Si vous avez besoin que les clés soient des nombres, vous pouvez mapper le résultat sur un nouveau tableau avec une fonction de rappel qui remplace la clé de chaque paire par un numéro forcé.
J'utilise une fonction de flèche et
Object.assign
pour le rappel de carte dans l'exemple ci-dessus afin de pouvoir le conserver dans une instruction en tirant parti du fait queObject.assign
renvoie l'objet auquel est affecté, et la valeur de retour d'une seule fonction de flèche d'instruction est le résultat de l'instruction.Cela équivaut à:
Comme mentionné par @TravisClarke dans les commentaires, la fonction de carte pourrait être raccourcie à:
Cependant, cela créerait un nouveau tableau pour chaque paire clé-valeur, au lieu de modifier le tableau existant en place, doublant ainsi la quantité de tableaux de paires clé-valeur créés. Bien que le tableau d'entrées d'origine soit toujours accessible, il et ses entrées ne seront pas récupérés.
Maintenant, même si l'utilisation de notre méthode sur place utilise toujours deux tableaux qui contiennent les paires clé-valeur (les tableaux d'entrée et de sortie), le nombre total de tableaux ne change que d'un. Les tableaux d'entrée et de sortie ne sont pas réellement remplis de tableaux, mais plutôt les références aux tableaux et ces références occupent une quantité négligeable d'espace en mémoire.
Vous pouvez aller plus loin et éliminer complètement la croissance en modifiant le tableau d'entrées en place au lieu de le mapper à un nouveau tableau:
la source
Object.entries(obj).map(e => [+e[0], e[1]]);
Pour récapituler certaines de ces réponses dès 2018, où ES6 est la norme.
En commençant par l'objet:
Cette dernière méthode, elle pourrait également réorganiser l'ordre des tableaux en fonction de la valeur des clés. Parfois, cela pourrait être le comportement souhaité (parfois pas). Mais l'avantage est maintenant que les valeurs sont indexées sur le bon emplacement de tableau, essentiel et trivial pour faire des recherches dessus.
Enfin (ne fait pas partie de la question d'origine, mais pour être complet), si vous avez besoin de rechercher facilement à l'aide de la clé ou de la valeur, mais que vous ne voulez pas de tableaux clairsemés, pas de doublons et pas de réorganisation sans avoir besoin de convertir en touches numériques ( même peut accéder à des clés très complexes), alors le tableau (ou l'objet) n'est pas ce dont vous avez besoin. Je recommanderai
Map
plutôt:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
la source
Encore une autre solution
Object.entries
qui ne fonctionnera pas pour vous.la source
Dans Ecmascript 6,
violon
la source
.map((value)=>(value))
partie n'a pas de sens - elle retourne juste un tableau d'entrée exactement équivalent à celui obtenu à partir de l'Object.entries(obj)
appel.Utilisation
Object.keys
etArray#map
méthodes.la source
Utilisez
Object.entries
pour obtenir chaque élément de l'objet aukey & value
format, puis àmap
travers eux comme ceci:Mais, si vous êtes certain que les touches seront dans un ordre progressif, vous pouvez utiliser
Object.values
etArray#map
faire quelque chose comme ceci:la source
Si vous utilisez lodash, cela pourrait être aussi simple que cela:
la source
Avec lodash, en plus de la réponse fournie ci-dessus, vous pouvez également avoir la clé dans le tableau de sortie.
Sans les clés d'objet dans le tableau de sortie
pour:
Si obj est le suivant:
Le tableau sera alors:
Avec les clés d'objet dans le tableau de sortie
Si vous écrivez à la place («genre» est une chaîne que vous choisissez):
Tu auras:
la source
Je suggère cette solution la plus simple à utiliser
Object.entries()
la source
Vous pouvez utiliser
Object.values([])
, vous pourriez avoir besoin de ce polyfill si vous ne l'avez pas déjà:https://stackoverflow.com/a/54822153/846348
Ensuite, vous pouvez simplement faire:
N'oubliez pas que les tableaux en js ne peuvent utiliser que des touches numériques, donc si vous avez utilisé autre chose dans l'objet, ceux-ci deviendront `0,1,2 ... x ''
Il peut être utile de supprimer des doublons par exemple si vous avez une clé unique.
la source
Utiliser pour dans
la source
Convertir récursivement un objet en tableau
la source
Nous pouvons changer le nombre en type de chaîne pour la clé comme ci-dessous:
la source
la source
Voici ma simple implémentation barebone:
la source
Solution simple
"
la source
vous pouvez utiliser _.castArray (obj) .
exemple:
_.castArray({ 'a': 1 }); // => [{ 'a': 1 }]
la source