Existe-t-il un moyen intelligent (c'est-à-dire optimisé) de renommer une clé dans un objet javascript?
Une manière non optimisée serait:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
javascript
object
key
rename
Jean Vincent
la source
la source
Réponses:
La façon la plus complète (et correcte) de procéder serait, je crois:
Cette méthode garantit que la propriété renommée se comporte de manière identique à la propriété d'origine.
De plus, il me semble que la possibilité d'envelopper cela dans une fonction / méthode et de l'intégrer
Object.prototype
n'est pas pertinente en ce qui concerne votre question.la source
if (old_key !== new_key)
vers:if (old_key !== new_key && o[old_key])
Vous pouvez envelopper le travail dans une fonction et l'affecter au
Object
prototype. Peut-être utiliser le style d'interface fluide pour faire couler plusieurs renommages.Spécifique à ECMAScript 5
Je souhaite que la syntaxe ne soit pas aussi complexe mais c'est vraiment bien d'avoir plus de contrôle.
la source
Object.defineProperty
.hasOwnProperty
pour vérifier les propriétés et lesfor ... in
boucles, alors pourquoi est-ce important si nous étendons Object?Si vous mutez votre objet source, ES6 peut le faire sur une seule ligne.
Ou deux lignes si vous souhaitez créer un nouvel objet.
la source
[]
autournewKey
? La solution fonctionne sans cela en fait.Si quelqu'un doit renommer une liste de propriétés:
Usage:
la source
my_object_property
enmyObjectProperty
, cependant, si ma propriété était composée d'un seul mot, la clé a été supprimée. +1Je voudrais juste utiliser le
ES6(ES2015)
chemin!la source
Si vous ne voulez pas muter vos données, pensez à cette fonction ...
Une explication approfondie par Yazeed Bzadough https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd
la source
La plupart des réponses ici ne parviennent pas à maintenir l'ordre des paires clé-valeur de l'objet JS. Si vous avez une forme de paires clé-valeur d'objet à l'écran que vous souhaitez modifier, par exemple, il est important de conserver l'ordre des entrées d'objet.
La façon ES6 de parcourir l'objet JS et de remplacer la paire clé-valeur par la nouvelle paire avec un nom de clé modifié serait quelque chose comme:
La solution préserve l'ordre des entrées en ajoutant la nouvelle entrée à la place de l'ancienne.
la source
Vous pouvez essayer le lodash
_.mapKeys
.la source
Une variation utilisant l'opérateur de déstructuration et de propagation d'objets:
la source
Personnellement, le moyen le plus efficace pour renommer des clés dans un objet sans implémenter des plugins et des roues très lourds:
Vous pouvez également l'envelopper
try-catch
si votre objet a une structure non valide. Fonctionne parfaitement :)la source
'a'
dans{ a: 1, aa: 2, aaa: 3}
ou essayer de renommer un objet avec des valeurs qui ne sont rien de plus que des chaînes ou des nombres ou des booléens, ou essayez avec des références circulaires.Pour ajouter un préfixe à chaque clé:
la source
Je ferais quelque chose comme ça:
la source
Je dirais qu'il serait préférable d'un point de vue conceptuel de laisser simplement l'ancien objet (celui du service Web) tel quel et de mettre les valeurs dont vous avez besoin dans un nouvel objet. Je suppose que vous extrayez des champs spécifiques à un moment ou à un autre de toute façon, sinon sur le client, du moins sur le serveur. Le fait que vous ayez choisi d'utiliser des noms de champs identiques à ceux du service Web, uniquement en minuscules, ne change rien à cela. Donc, je vous conseille de faire quelque chose comme ça:
Bien sûr, je fais toutes sortes d'hypothèses ici, ce qui n'est peut-être pas vrai. Si cela ne s'applique pas à vous, ou si c'est trop lent (est-ce? Je n'ai pas testé, mais j'imagine que la différence diminue avec l'augmentation du nombre de champs), veuillez ignorer tout cela :)
Si vous ne voulez pas le faire, et que vous ne devez prendre en charge que des navigateurs spécifiques, vous pouvez également utiliser les nouveaux getters pour renvoyer également "majuscule (champ)": voir http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demos / et les liens sur cette page pour plus d'informations.
ÉDITER:
Incroyablement, c'est aussi presque deux fois plus rapide, au moins sur mon FF3.5 au travail. Voir: http://jsperf.com/spiny001
la source
Bien que cela ne donne pas exactement une meilleure solution pour renommer une clé, il fournit un moyen ES6 rapide et facile de renommer toutes les clés d'un objet sans muter les données qu'elles contiennent.
la source
Certaines des solutions répertoriées sur cette page ont des effets secondaires:
Voici une solution qui conserve la position de la clé au même endroit et est compatible dans IE9 +, mais doit créer un nouvel objet et peut ne pas être la solution la plus rapide:
Remarque: IE9 peut ne pas prendre en charge forEach en mode strict
la source
Voici un exemple pour créer un nouvel objet avec des clés renommées.
la source
Encore une autre façon avec la méthode REDUCE la plus puissante .
la source
Ceci est une petite modification que j'ai apportée à la fonction de bombardier; Pour pouvoir prendre un tableau d'objets au lieu d'un objet seul et vous pouvez également activer l'index. les "clés" peuvent également être attribuées par un tableau
tester
la source
Votre chemin est optimisé, à mon avis. Mais vous vous retrouverez avec des clés réorganisées. La clé nouvellement créée sera ajoutée à la fin. Je sais que vous ne devriez jamais vous fier à l'ordre des clés, mais si vous devez le conserver, vous devrez parcourir toutes les clés et construire un nouvel objet un par un, en remplaçant la clé en question pendant ce processus.
Comme ça:
la source
la source
essayez-le dans votre éditeur préféré <3
la source