ECMAScript 2018 Standard-Methode
Sie würden verwenden Objektausbreitung :
let merged = {...obj1, ...obj2};
merged
ist nun die Vereinigung von obj1
y obj2
. Eigenschaften in obj2
überschreiben die in obj1
.
/** There's no limit to the number of objects you can merge.
* Later properties overwrite earlier properties with the same name. */
const allRules = {...obj1, ...obj2, ...obj3};
Hier ist auch die MDN-Dokumentation für diese Syntax. Wenn Sie babel verwenden, benötigen Sie die babel-plugin-transform-object-rest-spread Plugin, damit es funktioniert.
ECMAScript 2015 (ES6) Standardverfahren
/* For the case in question, you would do: */
Object.assign(obj1, obj2);
/** There's no limit to the number of objects you can merge.
* All objects get merged into the first object.
* Only the object in the first argument is mutated and returned.
* Later properties overwrite earlier properties with the same name. */
const allRules = Object.assign({}, obj1, obj2, obj3, etc);
(siehe MDN JavaScript-Referenz )
Methode für ES5 und frühere Versionen
for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
Beachten Sie, dass dies einfach alle Attribute von obj2
a obj1
was vielleicht nicht das ist, was Sie wollen, wenn Sie weiterhin die unveränderte obj1
.
Wenn Sie ein Framework verwenden, das Ihre Prototypen durcheinanderwirbelt, müssen Sie sich mit Prüfungen wie hasOwnProperty
aber dieser Code wird in 99 % der Fälle funktionieren.
Beispielfunktion:
/**
* Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
* @param obj1
* @param obj2
* @returns obj3 a new object based on obj1 and obj2
*/
function merge_options(obj1,obj2){
var obj3 = {};
for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
return obj3;
}
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, diearrays
verwenden Sie dann die Option "arrayMerge" von github "TehShrike/deepmerge", wie erwähnt aquí .