Schauen wir uns ein Beispiel an.
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Ich muss diese 2 Arrays von Objekten zusammenführen und das folgende Array erstellen:
arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
Gibt es dafür eine JavaScript- oder jQuery-Funktion?
$.extend
passt nicht zu mir Es kehrt zurück
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Alexander
quelle
quelle
{name: "lang", value: "English"}
?Antworten:
Wenn Sie 2 Arrays von Objekten in JavaScript zusammenführen möchten. Sie können diesen einzeiligen Trick verwenden
Array.prototype.push.apply(arr1,arr2);
Beispielsweise
Ausgabe:
quelle
arr1 = arr1.concat(arr2)
concat
gibt ein neues Array zurück und bricht alle Referenzen, die Sie hatten.Mit ES6 können Sie dies ganz einfach wie folgt tun:
Ausgabe:
quelle
{ name: 'lang', value: 'German'}
Für diejenigen, die mit modernen Dingen experimentieren:
quelle
Update 12. Oktober 2019
Neue Version, die nur auf neuerem Javascript basiert und keine Bibliothek von Drittanbietern benötigt.
Diese Antwort wurde alt, Bibliotheken wie Lodash und Unterstrich werden heutzutage viel weniger benötigt. In dieser neuen Version ist das Zielarray (arr1) dasjenige, mit dem wir arbeiten und das wir auf dem neuesten Stand halten möchten. Das Quellarray (arr2) ist der Ort, von dem die neuen Daten stammen, und wir möchten, dass sie mit unserem Ziel zusammengeführt werden - Array.
Wir Schleife über die Quell Array für neue Daten suchen, und für jedes Objekt , das noch nicht in unserem gefunden Ziel Array wir einfach das Objekt mit Hilfe von Add target.push (sourceElement) Wenn auf der Grundlage unserer Schlüsseleigenschaft ( ‚name‘) , ein Objekt befindet sich bereits in unserem Zielarray - wir aktualisieren seine Eigenschaften und Werte mithilfe von Object.assign (targetElement, sourceElement). . . Unser "Ziel" wird immer das gleiche Array und mit aktualisierten Inhalten sein.
Alte Antwort mit Unterstrich oder Lodash
Ich komme immer von Google hierher und bin immer nicht zufrieden mit den Antworten. Ihre Antwort ist gut, aber mit underscore.js wird es einfacher und ordentlicher
DEMO: http://jsfiddle.net/guya/eAWKR/
Hier ist eine allgemeinere Funktion, mit der zwei Arrays mithilfe einer Eigenschaft ihrer Objekte zusammengeführt werden. In diesem Fall ist die Eigenschaft 'Name'
quelle
quelle
Sehr einfach mit ES6 Spread Operator:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Hinweis: Die obige Lösung besteht darin, nur zwei Arrays mit dem ES6-Spread-Operator zusammenzuführen.
Bearbeiten am 07. Januar 2020 von @ bh4r4th: Da sich der Kontext aufgrund von Änderungen nach meiner ursprünglichen Lösung geändert hat. Ich möchte meine Lösung aktualisieren, um sie an die aktuellen Kriterien anzupassen. dh
Zusammenführen von Array-Objekten ohne Erstellen doppelter Objekte und
Aktualisieren Sie das,
value
wenn diename
Eigenschaft bereits im vorherigen Array vorhanden istquelle
set
beim Zusammenführen zum Entfernen von Duplikaten zu verwenden. Dies würde ein neues variables Argument, aber minimalen Code erzeugen. Ich bin jedoch kein großer Fan von Nutzdaten, deren Namen als Eigenschaften und Werte als unterschiedliche Typen definiert sind. Stattdessen bevorzuge ich[ { lang: 'German', age: 25}]
. Auf diese Weise wird das Nutzlastgewicht bei der Kommunikation zwischen Diensten minimiert.Zusammenführen von zwei Arrays:
Zusammenführen von zwei Arrays ohne doppelte Werte für 'name':
quelle
Der einfachste Weg ist mit etwas ES6-Magie:
Füge zwei mit Duplikaten zusammen:
Ohne Duplikate ist es dasselbe wie das obige Plus:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
quelle
Mit lodash:
quelle
So habe ich ein ähnliches Problem in einem ES6-Kontext angegangen:
Hinweis: Dieser Ansatz gibt keine Elemente aus Array1 zurück, die nicht in Array2 angezeigt werden.
BEARBEITEN: Ich habe einige Szenarien, in denen ich Elemente beibehalten möchte, die nicht im zweiten Array enthalten sind, und habe daher eine andere Methode entwickelt.
quelle
Noch eine andere Version mit
reduce() method
:quelle
quelle
Sie können ein Objekt verwenden, um Ihre Eigenschaften zu sammeln, während Sie Duplikate ersetzen, und dieses Objekt dann wieder zu einem Array erweitern / reduzieren. Etwas wie das:
Ich weiß nicht, ob dies der schnellste Weg ist, aber er funktioniert für eine beliebige Anzahl von Eingabearrays. Zum Beispiel:
Gibt dir das gleiche, was drin
a
wararr3
mit „deutsch“ ersetzt durch „Pfannkuchen“.Bei diesem Ansatz wird davon ausgegangen, dass Ihre Objekte alle gleich sind
{name: ..., value: ...}
Form haben.Sie können es hier sehen (öffnen Sie bitte Ihre Konsole): http://jsfiddle.net/ambiguous/UtBbB/
quelle
Was ist mit jQuery Merge?
http://api.jquery.com/jQuery.merge/
jsFiddle Beispiel hier: http://jsfiddle.net/ygByD/
quelle
name
Eigenschaften statt.Ich hatte das gleiche Problem und basierend auf der Antwort von Guya habe ich die Unterstrichbibliothek erweitert und auch ein bisschen mehr Funktionalität hinzugefügt, die ich benötigte. Hier ist das Wesentliche .
Hoffe es ist nützlich! Grüße!
quelle
Ich war kürzlich mit diesem Problem verblüfft und kam hierher mit der Hoffnung, eine Antwort zu haben, aber die akzeptierte Antwort verwendet 2 für In-Schleifen, die ich nicht bevorzugen würde. Ich habe es endlich geschafft, meine eigenen zu machen. Hängt überhaupt nicht von einer Bibliothek ab:
Dies hält auch die Reihenfolge von arr1 aufrecht.
quelle
Sie könnten folgende Funktion verwenden
und versuche
quelle
Hier filtere ich zuerst
arr1
basierend auf dem Element, das in vorhanden istarr2
oder nicht. Wenn es vorhanden ist, fügen Sie es nicht zum resultierenden Array hinzu, andernfalls fügen Sie es hinzu. Und dann hänge icharr2
an das Ergebnis.quelle
Aus dem Kopf - versuchen Sie es mit jquery verlängern
quelle
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
quelle
Array.protype.push.apply()
Antwort, aber es führt nicht die Zusammenführung durch, wie OP es wollte.Basierend auf der Antwort von @ YOU, aber unter Beibehaltung der Reihenfolge:
Ich weiß, dass diese Lösung weniger effizient ist, aber es ist notwendig, wenn Sie die Reihenfolge beibehalten und die Objekte dennoch aktualisieren möchten.
quelle
Hier ist ein jQuery-Plugin, das ich geschrieben habe, um zwei Objektarrays mit einem Schlüssel zusammenzuführen. Beachten Sie, dass dadurch das Zielarray an Ort und Stelle geändert wird.
ES6-Version
quelle
Mit lodash möchten Sie _.uniqBy
Reihenfolge von arr1, arr2 zählt!
Siehe Dokumente https://lodash.com/docs/4.17.4#uniqBy
quelle
quelle
quelle
Wenn Sie die beiden Arrays zusammenführen möchten, aber doppelte Objekte entfernen möchten, verwenden Sie diese Option. An
.uniqueId
jedem Objekt werden Duplikate identifiziertquelle
Versuche dies:
OutPut wird sein:
quelle
quelle
Lösung mit JS Map:
Welches produziert:
quelle
quelle