469 Stimmen

JavaScript: Objekt Umbenennen Taste

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 ];

5voto

Umang Punkte 173

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"}

5voto

eli Punkte 51

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
}

5voto

Spiny Norman Punkte 8142

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

5voto

Tudor Morar Punkte 3264

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);

4voto

Jasdeep Khalsa Punkte 6270

Einige der auf dieser Seite aufgeführten Lösungen haben Nebenwirkungen:

  1. die Position des Schlüssels im Objekt beeinflussen, indem er am unteren Rand hinzugefügt wird (falls dies für Sie von Bedeutung ist)
  2. würde im IE9+ nicht funktionieren (falls das für Sie wichtig ist)

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.com

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.

Powered by:

X