Gibt es eine clevere (d.h. 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 ];
Gibt es eine clevere (d.h. 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 ];
Eine andere Möglichkeit, Object Key umzubenennen:
Betrachten wir dieses Objekt:
let obj = {"name": "John", "id": 1, "last_name": "Doe"}
Benennen wir den Schlüssel name in first_name um:
let { name: first_name, ...rest } = obj;
obj = { first_name, ...rest }
Jetzt geht es um das Objekt:
{"first_name": "John", "id": 1, "last_name": "Doe"}
Wenn Sie die Iterationsreihenfolge (Reihenfolge des Einfügens) beibehalten wollen, hier ein Vorschlag:
const renameObjectKey = (object, oldName, newName) => {
const updatedObject = {}
for(let key in object) {
if (key === oldName) {
newObject[newName] = object[key]
} else {
newObject[key] = object[key]
}
}
object = updatedObject
}
Ich würde sagen, dass es aus konzeptioneller Sicht besser wäre, das alte Objekt (das vom Webdienst) so zu belassen, wie es ist, und die Werte, die Sie benötigen, in ein neues Objekt zu übertragen. Ich gehe davon aus, dass Sie ohnehin an der einen oder anderen Stelle bestimmte Felder extrahieren, wenn nicht auf dem Client, dann zumindest auf dem Server. Die Tatsache, dass Sie sich entschieden haben, Feldnamen zu verwenden, die mit denen des Webdienstes übereinstimmen, nur in Kleinbuchstaben, ändert daran nichts. Ich würde Ihnen also raten, etwas in dieser Art zu tun:
var myObj = {
field1: theirObj.FIELD1,
field2: theirObj.FIELD2,
(etc)
}
Natürlich stelle ich hier alle möglichen Annahmen auf, die vielleicht nicht zutreffen. Wenn dies nicht auf Sie zutrifft oder wenn es zu langsam ist (ist es das? Ich habe es nicht getestet, aber ich vermute, dass der Unterschied mit zunehmender Anzahl von Feldern kleiner wird), dann ignorieren Sie bitte all das hier :)
Wenn Sie dies nicht tun wollen und nur bestimmte Browser unterstützen müssen, können Sie auch die neuen Getter verwenden, um auch "uppercase(field)" zurückzugeben: 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.
EDIT。
Unglaublich, das ist auch fast doppelt so schnell, zumindest auf meinem FF3.5 bei der Arbeit. Siehe: http://jsperf.com/spiny001
Dies ist zwar nicht gerade eine bessere Lösung für das Umbenennen eines Schlüssels, aber es bietet eine schnelle und einfache ES6-Möglichkeit, alle Schlüssel in einem Objekt umzubenennen, ohne die darin enthaltenen Daten zu verändern.
let b = {a: ["1"], b:["2"]};
Object.keys(b).map(id => {
b[`root_${id}`] = [...b[id]];
delete b[id];
});
console.log(b);
Einige der auf dieser Seite aufgeführten Lösungen haben Nebenwirkungen:
Hier ist eine Lösung, bei der die Position der Taste an der gleichen Stelle bleibt und die mit IE9+ kompatibel ist, allerdings muss ein neues Objekt erstellt werden, was möglicherweise nicht die schnellste Lösung ist:
function renameObjectKey(oldObj, oldName, newName) {
const newObj = {};
Object.keys(oldObj).forEach(key => {
const value = oldObj[key];
if (key === oldName) {
newObj[newName] = value;
} else {
newObj[key] = value;
}
});
return newObj;
}
Bitte beachten Sie: IE9 unterstützt forEach im Strict-Modus möglicherweise nicht.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.