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

1voto

antony Punkte 2593

Ich fange gerade erst mit JavaScript an, also korrigieren Sie mich, wenn ich falsch liege.

Aber wäre es nicht besser, wenn Sie eine beliebige Anzahl von Objekten zusammenführen könnten? Ich zeige Ihnen, wie ich das mit dem nativen Arguments Objekt.

Der Schlüssel dazu ist, dass Sie tatsächlich eine beliebige Anzahl von Argumenten an eine JavaScript-Funktion übergeben können, ohne sie in der Funktionsdeklaration zu definieren. Sie können nur nicht auf sie zugreifen, ohne das Arguments-Objekt zu verwenden.

function mergeObjects() (
    var tmpObj = {};

    for(var o in arguments) {
        for(var m in arguments[o]) {
            tmpObj[m] = arguments[o][m];
        }
    }
    return tmpObj;
}

1voto

Ryan Walls Punkte 6882

Für diejenigen, die Node.js gibt es ein NPM-Modul: node.extend

Installieren:

npm install node.extend

Verwendung:

var extend = require('node.extend');
var destObject = extend(true, {}, sourceObject);
// Where sourceObject is the object whose properties will be copied into another.

1 Stimmen

Es handelt sich nicht um eine eingebaute Bibliothek, sondern um ein NPM-Modul.

1voto

Egor Kloos Punkte 65

Ich habe Object.create() verwendet, um die Standardeinstellungen beizubehalten (unter Verwendung von __proto__ oder Object.getPrototypeOf() ).

function myPlugin( settings ){
    var defaults = {
        "keyName": [ "string 1", "string 2" ]
    }
    var options = Object.create( defaults );
    for (var key in settings) { options[key] = settings[key]; }
}
myPlugin( { "keyName": ["string 3", "string 4" ] } );

Auf diese Weise kann ich später jederzeit 'concat()' oder 'push()' verwenden.

var newArray = options['keyName'].concat( options.__proto__['keyName'] );

Hinweis : Sie müssen vor der Verkettung eine hasOwnProperty-Prüfung durchführen, um Doppelungen zu vermeiden.

0voto

Die korrekte Umsetzung in Prototyp sollte folgendermaßen aussehen:

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

obj1 = Object.extend(obj1, obj2);

0voto

Nishant Kumar Punkte 5856

Hier ist, was ich in meiner Codebasis zum Zusammenführen verwendet habe.

function merge(to, from) {
  if (typeof to === 'object' && typeof from === 'object') {
    for (var pro in from) {
      if (from.hasOwnProperty(pro)) {
        to[pro] = from[pro];
      }
    }
  }
  else{
      throw "Merge function can apply only on object";
  }
}

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