3287 Stimmen

Wie kann ich die Eigenschaften von zwei JavaScript-Objekten dynamisch zusammenführen?

Ich muss in der Lage sein, zwei (sehr einfache) JavaScript-Objekte zur Laufzeit zu verschmelzen. Zum Beispiel würde ich gerne:

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

obj1.merge(obj2);

//obj1 now has three properties: food, car, and animal

Gibt es eine eingebaute Möglichkeit, dies zu tun? Ich brauche keine Rekursion, und ich muss nicht Funktionen zusammenführen, nur Methoden auf flache Objekte.

0 Stimmen

Es ist erwähnenswert diese Antwort auf eine ähnliche Frage , die zeigt, wie man "eine Ebene tiefer" zusammenführt. Das heißt, es werden Werte mit doppelten Schlüsseln zusammengeführt (anstatt den ersten Wert mit dem zweiten zu überschreiben), aber es wird nicht weiter rekursiert als das. IMHO ist es ein guter, sauberer Code für diese Aufgabe.

0 Stimmen

Übrigens führen die ersten paar Antworten eine "oberflächliche" Zusammenführung durch: Wenn derselbe Schlüssel sowohl in obj1 als auch in obj2 vorhanden ist, wird der Wert in obj2 beibehalten, der Wert in obj1 wird gelöscht. Wenn z.B. das Beispiel der Frage var obj2 = { animal: 'dog', food: 'bone' }; wäre die Verschmelzung { food: 'bone', car: 'ford', animal: 'dog' } . Wenn Sie mit "verschachtelten Daten" arbeiten und eine "tiefe Zusammenführung" wünschen, suchen Sie nach Antworten, die "tiefe Zusammenführung" oder "Rekursion" erwähnen. Wenn Sie Werte haben, die arrays verwenden Sie dann die Option "arrayMerge" von github "TehShrike/deepmerge", wie erwähnt aquí .

5voto

pagid Punkte 12823

Es ist erwähnenswert, dass die Version aus dem 140byt.es Kollektion löst die Aufgabe auf kleinstem Raum und ist für diesen Zweck einen Versuch wert:

Code:

function m(a,b,c){for(c in b)b.hasOwnProperty(c)&&((typeof a[c])[0]=='o'?m(a[c],b[c]):a[c]=b[c])}

Verwendung für Ihren Zweck:

m(obj1,obj2);

Hier ist die original Gist .

5voto

Raphaël Punkte 1648

Sie sollten lodashs defaultsDeep

_.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
//  { 'user': { 'name': 'barney', 'age': 36 } }

4voto

Soura Ghosh Punkte 785

Spread-Operator verwenden, der der ES6-Version folgt

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
let result = {...obj1,...obj2};
console.log(result)

output { food: 'pizza', car: 'ford', animal: 'dog' }

4voto

Kavale arun Punkte 511

Sie können verwenden Object.assign Methode. Zum Beispiel:

var result = Object.assign(obj1, obj2);

Beachten Sie auch, dass dabei eine flache Kopie des Objekts erstellt wird.

4voto

Paweł Otto Punkte 106

ES2018/TypeScript: Viele Antworten sind OK, aber ich habe eine elegantere Lösung für dieses Problem gefunden, wenn Sie zwei Objekte zusammenführen müssen ohne überlappende Objektschlüssel zu überschreiben .

Meine Funktion akzeptiert auch unbegrenzte Anzahl von Objekten als Funktionsargumente zusammenführen:

(Ich verwende hier TypeScript-Notation, Sie können die :object[] geben Sie das Funktionsargument ein, wenn Sie einfaches JavaScript verwenden).

const merge = (...objects: object[]) => {
  return objects.reduce((prev, next) => {
    Object.keys(prev).forEach(key => {
      next[key] = { ...next[key], ...prev[key] }
    })
    return next
  })
}

1 Stimmen

Dies scheint nicht zu funktionieren? typescript-play.js.org/#code/

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