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

254voto

Valeriu Paloş Punkte 3161

Die vollständigste (und korrekteste) Vorgehensweise wäre meines Erachtens folgende:

if (old_key !== new_key) {
    Object.defineProperty(o, new_key,
        Object.getOwnPropertyDescriptor(o, old_key));
    delete o[old_key];
}

Diese Methode stellt sicher, dass die umbenannte Eigenschaft verhält sich identisch zum Original.

Außerdem scheint es mir, dass die Möglichkeit, dies in eine Funktion/Methode zu verpacken und sie in Object.prototype ist für Ihre Frage irrelevant.

181voto

nverba Punkte 3275

Wenn Sie Ihr Quellobjekt mutieren, kann ES6 dies in einer Zeile erledigen.

delete Object.assign(o, {[newKey]: o[oldKey] })[oldKey];

Oder zwei Zeilen, wenn Sie ein neues Objekt erstellen möchten.

const newObject = {};
delete Object.assign(newObject, o, {[newKey]: o[oldKey] })[oldKey];

111voto

ChaosPandion Punkte 75527

Sie könnten die Arbeit in eine Funktion verpacken und sie dem Object Prototyp. Verwenden Sie vielleicht den Stil der fließenden Schnittstelle, um mehrere Umbenennungen fließend zu machen.

Object.prototype.renameProperty = function (oldName, newName) {
     // Do nothing if the names are the same
     if (oldName === newName) {
         return this;
     }
    // Check for the old property name to avoid a ReferenceError in strict mode.
    if (this.hasOwnProperty(oldName)) {
        this[newName] = this[oldName];
        delete this[oldName];
    }
    return this;
};

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.

Object.defineProperty(
    Object.prototype, 
    'renameProperty',
    {
        writable : false, // Cannot alter this property
        enumerable : false, // Will not show up in a for-in loop.
        configurable : false, // Cannot be deleted via the delete operator
        value : function (oldName, newName) {
            // Do nothing if the names are the same
            if (oldName === newName) {
                return this;
            }
            // Check for the old property name to 
            // avoid a ReferenceError in strict mode.
            if (this.hasOwnProperty(oldName)) {
                this[newName] = this[oldName];
                delete this[oldName];
            }
            return this;
        }
    }
);

85voto

pomber Punkte 21013

Für den Fall, dass jemand eine Liste von Eigenschaften umbenennen muss:

function renameKeys(obj, newKeys) {
  const keyValues = Object.keys(obj).map(key => {
    const newKey = newKeys[key] || key;
    return { [newKey]: obj[key] };
  });
  return Object.assign({}, ...keyValues);
}

Verwendung:

const obj = { a: "1", b: "2" };
const newKeys = { a: "A", c: "C" };
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);
// {A:"1", b:"2"}

43voto

piotr_cz Punkte 7077

So fügen Sie jedem Schlüssel ein Präfix hinzu:

const obj = {foo: 'bar'}

const altObj = Object.fromEntries(
  Object.entries(obj).map(([key, value]) => 
    // Modify key here
    [`x-${key}`, value]
  )
)

// altObj = {'x-foo': 'bar'}

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