Clé Swap avec la valeur JSON
J'ai un très gros objet JSON structuré comme ceci:
{A : 1, B : 2, C : 3, D : 4}
J'ai besoin d'une fonction qui permet de permuter les valeurs avec les touches de mon objet et je ne sais pas comment le faire. J'aurais besoin d'une sortie comme celle-ci:
{1 : A, 2 : B, 3 : C, 4 : D}
Est-il possible que je peux le faire manuellement créé un nouvel objet où tout est échangé?
Grâce
- sont toutes les valeurs des nombres et les chiffres répéter? Si les valeurs de répétition, alors vous ne serez pas en mesure de les échanger comme ils vont écraser les autres, à moins de modifier leur valeur à une valeur unique. Il pourrait y avoir une meilleure solution, ce qui est la raison pour avoir besoin du swap?
- Ils sont tous des nombres, mais elles ne sont pas répétées. Je suis en train de faire une base de chiffrement.
- Il est intéressant de noter qu'un "swap" de l'opération, comme cela est problématique pour [au moins] deux raisons: 1) les Valeurs sont exprimées à Cordes quand ils deviennent des touches de ne pas être surpris, quand vous avez inattendu "[object object]" les clés. Et 2) les valeurs en double (après la fonte de la Chaîne) d'être écrasés. #1, au moins, peut être résolu par la création d'une Carte au lieu d'un Objet, ainsi:
function swap(obj) {return new Map(Object.entries(x).map([k, v] => [v, k]))}
Vous devez vous connecter pour publier un commentaire.
Exemple ici VIOLON n'oubliez pas d'allumer votre console pour voir les résultats.
ES6 version:
Récupérer les clés de l'objet, et ensuite utiliser le Tableau de la fonction de réduction de passer par chaque clé et définissez la valeur de la clé, et la clé de la valeur.
vous pouvez utiliser lodash fonction _.inverser il est également possible d'utiliser multivlaue
Dans l'ES6/ES2015 vous pouvez combiner l'utilisation de Objet.touches et réduire avec la nouvelle Objet.attribuer fonction, un la flèche de la fonction, et un calculé nom de la propriété pour une simple déclaration unique solution.
Si vous êtes transpiling à l'aide de la objet de la propagation de l'opérateur (étape 3 de la rédaction du présent) qui permettra de simplifier les choses un peu plus loin.
Enfin, si vous avez Objet.entrées disponible (étape 4 de l'écriture), vous pouvez nettoyer la logique un peu plus (OMI).
À l'aide de ES6:
Comme un complément de @joslarson et @jea réponses:
Sans ES6 nécessaire, vous pouvez utiliser
de l'Objet.les touches
Array.réduire
et la Opérateur Virgule:Certains peuvent trouver ça moche, mais c'est "un peu" plus vite que la
reduce
ne diffuse pas toutes les propriétés de laobj
sur chaque boucle.forEach
,map
oureduce
méthodes. J'ai fait cette réponse à un paquebot de solution sans la nécessité de l'es6 et encore pertinentes en termes de rapidité/efficacité.À l'aide de Ramda:
Essayer
JS:
Je crois que c'est mieux de le faire cette tâche à l'aide d'un mécanisme de prévention de module, comme
invert-kv
.inverser kv: Inverser la clé/valeur d'un objet. Exemple: {foo: 'bar'} → {bar: 'foo'}
https://www.npmjs.com/package/invert-kv
Pur Ramda dans une pure et point gratuit style:
Ou, avec un peu plus alambiqué ES6 version, encore fonctionnels purs:
object
viennent?map
est censé faire, vous l'utilisez commeforEach