Gibt es eine clevere (dh optimierte) Möglichkeit, einen Schlüssel in einem Javascript-Objekt umzubenennen?
Ein nicht optimierter Weg wäre:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
javascript
object
key
rename
Jean Vincent
quelle
quelle
Antworten:
Ich glaube, der vollständigste (und korrekteste) Weg, dies zu tun, wäre:
Diese Methode stellt sicher, dass sich die umbenannte Eigenschaft identisch mit der ursprünglichen verhält .
Außerdem scheint mir die Möglichkeit, dies in eine Funktion / Methode zu packen und
Object.prototype
einzufügen, für Ihre Frage irrelevant zu sein.quelle
if (old_key !== new_key)
zu:if (old_key !== new_key && o[old_key])
Sie können die Arbeit in eine Funktion einbinden und sie dem
Object
Prototyp zuweisen . Verwenden Sie möglicherweise den fließenden Schnittstellenstil, um mehrere Umbenennungen durchzuführen.ECMAScript 5-spezifisch
Ich wünschte, die Syntax wäre nicht so komplex, aber es ist auf jeden Fall schön, mehr Kontrolle zu haben.
quelle
Object.defineProperty
.hasOwnProperty
nach Eigenschaften und innerhalb vonfor ... in
Schleifen zu suchen , warum ist es dann wichtig, wenn wir Object erweitern?Wenn Sie Ihr Quellobjekt mutieren, kann ES6 dies in einer Zeile tun.
Oder zwei Zeilen, wenn Sie ein neues Objekt erstellen möchten.
quelle
[]
umnewKey
? Die Lösung funktioniert eigentlich ohne das.Falls jemand eine Liste von Eigenschaften umbenennen muss:
Verwendungszweck:
quelle
my_object_property
zumyObjectProperty
, aber wenn mein Eigentum Einzel formuliert ist, dann wurde der Schlüssel entfernt. +1Ich möchte nur den
ES6(ES2015)
Weg benutzen !quelle
Wenn Sie Ihre Daten nicht mutieren möchten, ziehen Sie diese Funktion in Betracht ...
Eine gründliche Erklärung von Yazeed Bzadough https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd
quelle
Die meisten Antworten hier halten die Reihenfolge der Schlüssel-Wert-Paare von JS-Objekten nicht aufrecht. Wenn Sie beispielsweise eine Form von Objektschlüssel-Wert-Paaren auf dem Bildschirm haben, die Sie ändern möchten, ist es wichtig, die Reihenfolge der Objekteinträge beizubehalten.
Die ES6-Methode zum Durchlaufen des JS-Objekts und zum Ersetzen des Schlüssel-Wert-Paares durch das neue Paar durch einen geänderten Schlüsselnamen lautet wie folgt:
Die Lösung behält die Reihenfolge der Einträge bei, indem der neue Eintrag anstelle des alten hinzugefügt wird.
quelle
Sie können lodash versuchen
_.mapKeys
.quelle
Eine Variation unter Verwendung des Objektzerstörungs- und Spread-Operators:
quelle
Persönlich der effektivste Weg, Schlüssel im Objekt umzubenennen, ohne extra schwere Plugins und Räder zu implementieren:
Sie können es auch einschließen,
try-catch
wenn Ihr Objekt eine ungültige Struktur hat. Funktioniert perfekt :)quelle
'a'
in{ a: 1, aa: 2, aaa: 3}
oder versuchen , ein Objekt mit Werten zu benennen , die nichts mehr sind als Strings oder Zahlen oder Boolesche Werte, oder versuchen , mit zirkulären Referenzen.So fügen Sie jedem Schlüssel ein Präfix hinzu:
quelle
Ich würde so etwas machen:
quelle
Ich würde sagen, dass es aus konzeptioneller Sicht besser wäre, das alte Objekt (das des Webdienstes) so zu belassen, wie es ist, und die benötigten Werte in ein neues Objekt einzufügen. Ich gehe davon aus, dass Sie sowieso an der einen oder anderen Stelle bestimmte Felder extrahieren, wenn nicht auf dem Client, dann zumindest auf dem Server. Die Tatsache, dass Sie Feldnamen verwendet haben, die mit denen des Webdienstes identisch sind, nur in Kleinbuchstaben, ändert daran nichts. Also würde ich raten, so etwas zu tun:
Natürlich mache ich hier alle möglichen Annahmen, die möglicherweise nicht zutreffen. Wenn dies nicht auf Sie zutrifft oder wenn es zu langsam ist (oder? Ich habe es nicht getestet, aber ich stelle mir vor, dass der Unterschied mit zunehmender Anzahl von Feldern kleiner wird), ignorieren Sie dies alles :)
Wenn Sie dies nicht möchten und nur bestimmte Browser unterstützen müssen, können Sie mit den neuen Gettern auch "Großbuchstaben (Feld)" zurückgeben: siehe http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demos / und die Links auf dieser Seite für weitere Informationen.
BEARBEITEN:
Unglaublich, das ist auch fast doppelt so schnell, zumindest auf meinem FF3.5 bei der Arbeit. Siehe: http://jsperf.com/spiny001
quelle
Dies bietet zwar keine bessere Lösung für das Umbenennen eines Schlüssels, bietet jedoch eine schnelle und einfache ES6-Möglichkeit, alle Schlüssel in einem Objekt umzubenennen, ohne die darin enthaltenen Daten zu mutieren.
quelle
Einige der auf dieser Seite aufgeführten Lösungen haben einige Nebenwirkungen:
Hier ist eine Lösung, die die Position des Schlüssels an derselben Stelle beibehält und in IE9 + kompatibel ist, jedoch ein neues Objekt erstellen muss und möglicherweise nicht die schnellste Lösung ist:
Bitte beachten Sie: IE9 unterstützt möglicherweise nicht jeden im strengen Modus
quelle
Hier ist ein Beispiel zum Erstellen eines neuen Objekts mit umbenannten Schlüsseln.
quelle
Ein weiterer Weg mit der leistungsstärksten REDUCE- Methode.
quelle
Dies ist eine kleine Modifikation, die ich an der Funktion von Pomber vorgenommen habe. Um ein Array von Objekten anstelle eines Objekts allein nehmen zu können, können Sie auch den Index aktivieren. Auch die "Schlüssel" können von einem Array zugewiesen werden
Prüfung
quelle
Ihr Weg ist meiner Meinung nach optimiert. Aber Sie werden mit neu geordneten Schlüsseln enden. Der neu erstellte Schlüssel wird am Ende angehängt. Ich weiß, dass Sie sich niemals auf die Schlüsselreihenfolge verlassen sollten, aber wenn Sie diese beibehalten müssen, müssen Sie alle Schlüssel durchgehen und nacheinander neue Objekte erstellen und dabei den betreffenden Schlüssel ersetzen.
So was:
quelle
quelle
Probieren Sie es einfach in Ihrem Lieblingseditor <3 aus
quelle