Die Zusammenführung von JSON-kompatiblen JavaScript-Objekten
Ich unterstütze die Verwendung und den Einsatz von nicht-destruktiven Methoden, die die ursprüngliche Quelle nicht verändern, 'Object.assign' ist eine destruktive Methode und zufällig ist es auch nicht so produktionsfreundlich weil es auf früheren Browsern nicht mehr funktioniert und man keine Möglichkeit hat, Parcheando sauber mit einer Alternative zu versehen.
Die Zusammenführung von JS-Objekten wird immer unerreichbar oder unvollständig sein, egal wie die Lösung aussieht. Aber das Zusammenführen von JSON-kompatiblen Objekten ist nur einen Schritt davon entfernt, einen einfachen und portablen Code für eine zerstörungsfreie Methode zum Zusammenführen einer Reihe von JS-Objekten in ein zurückgegebenes Master-Objekt zu schreiben, das alle eindeutigen Eigenschaftsnamen und ihre entsprechenden Werte enthält, die in einem einzigen Master-Objekt für den beabsichtigten Zweck zusammengefasst sind.
Wenn man bedenkt, dass MSIE8 der erste Browser ist, der eine native Unterstützung für das JSON-Objekt bietet, ist das eine große Erleichterung, und die Wiederverwendung der bereits vorhandenen Technologie ist immer eine willkommene Gelegenheit.
Die Beschränkung Ihres Codes auf JSON-kompatible Standardobjekte ist eher ein Vorteil als eine Einschränkung, da diese Objekte auch über das Internet übertragen werden können. Und natürlich gibt es für diejenigen, die eine tiefere Abwärtskompatibilität wünschen, immer ein json plug., dessen Methoden einfach einer JSON-Variablen im äußeren Code zugewiesen werden können, ohne dass die verwendete Methode geändert oder neu geschrieben werden muss.
function Merge( ){
var a = [].slice.call( arguments ), i = 0;
while( a[i] )a[i] = JSON.stringify( a[i++] ).slice( 1,-1 );
return JSON.parse( "{"+ a.join() +"}" );
}
(Natürlich kann man dem Ganzen auch einen aussagekräftigeren Namen geben, den ich noch nicht festgelegt habe; ich sollte es wahrscheinlich JSONmerge nennen)
Der Anwendungsfall:
var master = Merge( obj1, obj2, obj3, ...objn );
Nun, im Gegensatz zur Object.assign
Dabei bleiben alle Objekte unberührt und in ihrem ursprünglichen Zustand (für den Fall, dass Sie etwas falsch gemacht haben und die zusammenzuführenden Objekte neu anordnen oder separat für einen anderen Vorgang verwenden müssen, bevor Sie sie wieder zusammenführen).
Auch die Anzahl der Merge-Argumente ist begrenzt nur durch die Begrenzung der Länge der Argumente [die enorm ist]. Das nativ unterstützte JSON-Parsen/Stringify ist bereits maschinenoptimiert, d.h. es sollte schneller sein als jede geskriptete Form der JS-Schleife. Die Iteration über gegebene Argumente wird mit der while
- ist nachweislich die schnellste Schleife in JS.
Es schadet nicht, kurz zu erwähnen, dass wir bereits wissen, dass doppelte Eigenschaften der eindeutigen Objektbezeichnungen (Schlüssel) durch das spätere Objekt mit der gleichen Schlüsselbezeichnung überschrieben werden, was bedeutet, dass Sie die Kontrolle darüber haben, welche Eigenschaft die vorherige übernimmt, indem Sie einfach die Liste der Argumente ordnen oder neu ordnen. Und der Vorteil, ein sauberes und aktualisiertes Master-Objekt ohne Duplikate als endgültige Ausgabe zu erhalten.
;
var obj1 = {a:1}, obj2 = {b:2}, obj3 = {c:3}
;
function Merge( ){
var a = [].slice.call( arguments ), i = 0;
while( a[i] )a[i] = JSON.stringify( a[i++] ).slice( 1,-1 );
return JSON.parse( "{"+ a.join() +"}" );
}
;
var master = Merge( obj1, obj2, obj3 )
;
console.log( JSON.stringify( master ) )
;
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í .