Füge 2 Arrays von Objekten zusammen

112

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?

$.extendpasst nicht zu mir Es kehrt zurück

arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Alexander
quelle
15
Was ist passiert mit {name: "lang", value: "English"}?
Schatten-Assistent ist Ohr für Sie
Es tut uns leid. Ich erwähne $ .extend, nicht $ .merge.
Alexander
1
Ich meine, worum geht es in der Logik? Wie möchten Sie die Arrays zusammenführen? Das geht aus Ihren Beispielen nicht hervor.
Schatten-Assistent ist Ohr für Sie
Danke euch allen. Ich habe es manuell gemacht.
Alexander
6
@ShadowWizard, ich denke, was das OP bedeutete, war Update, falls vorhanden, und Push, wenn nicht.
Amin Mohamed Ajani

Antworten:

83

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

var arr1 = [{name: "lang", value: "English"},{name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

Array.prototype.push.apply(arr1,arr2); 

console.log(arr1);  // final merged result will be in arr1

Ausgabe:

[{"name":"lang","value":"English"},
{"name":"age","value":"18"},
{"name":"childs","value":"5"},
{"name":"lang","value":"German"}]
Jahanzaib Aslam
quelle
Dies ist bisher die einfachste Verwendung und funktioniert einwandfrei. Danke, dass du es geteilt hast.
Leo Caseiro
17
das gleiche Ergebnis wie das viel einfachere:arr1 = arr1.concat(arr2)
keithpjolley
7
aber das ist nicht verschmelzen!
Dimitri Kopriwa
1
Die Ergebnisse sind nicht die gleichen. concatgibt ein neues Array zurück und bricht alle Referenzen, die Sie hatten.
Bpainter
8
Dies beantwortet die Frage nicht, das resultierende Array sollte 3 Objekte haben, nicht 4. Sie haben die Beispielwerte geändert. Grundsätzlich möchte OP zwei Objektarrays zusammenführen und doppelte Werte entfernen.
Ranjan
43

Mit ES6 können Sie dies ganz einfach wie folgt tun:

var arr1 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = [...arr1, ...arr2];

Ausgabe:

    arr3 = [
      {"name":"lang","value":"German"},
      {"name":"age","value":"18"},
      {"name":"childs","value":"5"},
      {"name":"lang","value":"German"}
    ]
Nguyễn Bá Vinh
quelle
6
Dies sollte die beste Antwort sein.
Nocdib
19
Dies macht nicht das, wonach das OP gesucht hat, es sollte kein zweites Objekt enthalten{ name: 'lang', value: 'German'}
Will
3
Ich weiß nicht, warum diese Antwort gewählt wird. Was @ daveanderson88 will, ist diese Antwort anders.
Nguyễn Xuân Hoàng
33

Für diejenigen, die mit modernen Dingen experimentieren:

var odd = [
    { name : "1", arr: "in odd" },
    { name : "3", arr: "in odd" }
];

var even = [
    { name : "1", arr: "in even" },
    { name : "2", arr: "in even" },
    { name : "4", arr: "in even" }
];

// ----
// ES5 using Array.filter and Array.find
function merge(a, b, prop){
  var reduced = a.filter(function(aitem){
      return ! b.find(function(bitem){
          return aitem[prop] === bitem[prop];
      });
  });
  return reduced.concat(b);
}
console.log( "ES5", merge(odd, even, "name") );

// ----
// ES6 arrow functions
function merge(a, b, prop){
    var reduced =  a.filter( aitem => ! b.find ( bitem => aitem[prop] === bitem[prop]) )
  return reduced.concat(b);
}
console.log( "ES6", merge(odd, even, "name") );

// ----
// ES6 one-liner
var merge = (a, b, p) => a.filter( aa => ! b.find ( bb => aa[p] === bb[p]) ).concat(b);


console.log( "ES6 one-liner", merge(odd, even, "name") );

// Results
// ( stuff in the "b" array replaces things in the "a" array )
// [
//    {
//         "name": "3",
//         "arr": "in odd"
//     },
//     {
//         "name": "1",
//         "arr": "in even"
//     },
//     {
//         "name": "2",
//         "arr": "in even"
//     },
//     {
//         "name": "4",
//         "arr": "in even"
//     }
// ]
Bob
quelle
29

Update 12. Oktober 2019

Neue Version, die nur auf neuerem Javascript basiert und keine Bibliothek von Drittanbietern benötigt.

const mergeByProperty = (target, source, prop) => {
  source.forEach(sourceElement => {
    let targetElement = target.find(targetElement => {
      return sourceElement[prop] === targetElement[prop];
    })
    targetElement ? Object.assign(targetElement, sourceElement) : target.push(sourceElement);
  })
}
var target /* arr1 */ = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var source /* arr2 */ = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

mergeByProperty(target, source, 'name');

console.log(target)

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'

var arr1 = [{name: "lang", value: "English"}, {name: "age", value: "18"}];
var arr2 = [{name : "childs", value: '5'}, {name: "lang", value: "German"}];

function mergeByProperty(arr1, arr2, prop) {
  _.each(arr2, function(arr2obj) {
    var arr1obj = _.find(arr1, function(arr1obj) {
      return arr1obj[prop] === arr2obj[prop];
    });

    arr1obj ? _.extend(arr1obj, arr2obj) : arr1.push(arr2obj);
  });
}

mergeByProperty(arr1, arr2, 'name');

console.log(arr1);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.core.min.js"></script>

[{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
Guya
quelle
6
Fast identisch in LOC, Komplexität wie die Antwort von @ YOU, außer dass dies viel langsamer ist (hauptsächlich aufgrund zusätzlicher Funktionsaufrufe und der Tatsache, dass die Antwort von YOU den JS-Trick für assoziative Arrays ausnutzt, um Elemente mit O (1) -Suche zu finden). Dies ist neben der Tatsache, dass Sie eine zusätzliche Bibliothek mitbringen müssen.
Mrchief
Sie würden keinen Leistungsunterschied erzielen, wenn Sie sich nicht mit extremen Randfällen befassen. In Bezug auf den zusätzlichen lib - Unterstrich werden lodash und ähnliche im Allgemeinen bereits verwendet und haben andere Vorteile. Man sollte sie trotzdem in Betracht ziehen. Die meisten Entwickler und Apps werden von der Einfachheit und Allgemeinheit dieser Lösung profitieren.
Guya
1
@guya Mir ist klar, dass dies alt ist, aber Unterstrich, lodash und dergleichen werden im Allgemeinen bereits verwendet und haben andere Vorteile, während sie, wie Sie sagen, andere Vorteile haben, ist es eine große Annahme zu sagen, dass sie im Allgemeinen bereits verwendet werden.
Craicerjack
26
var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}
arr3 = arr3.concat(arr2);

Geben Sie hier die Bildbeschreibung ein

SIE
quelle
1
Diese Antwort hat eine schlechte Zeitkomplexität (O (n ^ 2)). Eine O (n) -Lösung ist unter Verwendung einer Hash-Map möglich.
Alex von Brandenfels
17

Sehr einfach mit ES6 Spread Operator:

const array1 = [{a: 'HI!'}, {b: 'HOW'}]
const array2 = [{c: 'ARE'}, {d: 'YOU?'}]

const mergedArray = [ ...array1, ...array2 ]
console.log('Merged Array: ', mergedArray)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

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

  1. Zusammenführen von Array-Objekten ohne Erstellen doppelter Objekte und

  2. Aktualisieren Sie das, valuewenn die nameEigenschaft bereits im vorherigen Array vorhanden ist

const arr1 = [
    { name: "lang", value: "English" },
    { name: "age", value: "18" }
]
const arr2 = [
    { name: "childs", value: '2' }, 
    { name: "lang", value: "German" }
]
const arr3 = [
    { name: "lang", value: "German" },
    { name: "age", value: "28" },
    { name: "childs", value: '5' }
]

// Convert to key value dictionary or object
const convertToKeyValueDict = arrayObj => {
    const val = {}
    arrayObj.forEach(ob => {
        val[ob.name] = ob.value
    })
    return val
}

// update or merge array
const updateOrMerge = (a1, a2) => {
    const ob1 = convertToKeyValueDict(a1)
    const ob2 = convertToKeyValueDict(a2)
    // Note: Spread operator with objects used here
    const merged_obj = {...ob1, ...ob2}
    const val = Object.entries(merged_obj)
    return val.map(obj => ({ name: obj[0], value: obj[1] }))
}

const v1 = updateOrMerge(arr1, arr2)
const v2 = updateOrMerge(v1, arr3)
console.log(`Merged array1 and array2: ${JSON.stringify(v1)} \n\n`)
console.log(`Merged above response and array3: ${JSON.stringify(v2)} \n\n`)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

bh4r4th
quelle
1
Dies sollte die akzeptierte Antwort im Jahr 2019 sein! Ich wollte die gleiche Lösung vorschlagen, nachdem ich mir die anderen Antworten mit höherer Stimmenzahl angesehen hatte! @Alexander Es ist leicht zu übersehen, aber bitte akzeptieren Sie dieses!
iaforek
Falsch. Der Fragesteller möchte Objekte speziell ERSETZEN, wenn sie eine doppelte Eigenschaft haben, und sie nicht einfach anhängen.
HaveSpacesuit
Vielen Dank für den Hinweis auf @HaveSpacesuit. Ich habe diese Frage im Jahr 2018 beantwortet, als der Kontext nur zwei Arrays zusammenführen soll. Wird diese Antwort bald bearbeiten, um sie setbeim 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: &#39;German&#39;, age: 25}] . Auf diese Weise wird das Nutzlastgewicht bei der Kommunikation zwischen Diensten minimiert.
bh4r4th
Ich habe jetzt die Lösung aktualisiert, um sie an den geänderten Kontext der Frage anzupassen.
bh4r4th
16

Zusammenführen von zwei Arrays:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var result=arr1.concat(arr2);
// result: [{name: "lang", value: "English"}, {name: "age", value: "18"}, {name : "childs", value: '5'}, {name: "lang", value: "German"}]

Zusammenführen von zwei Arrays ohne doppelte Werte für 'name':

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var i,p,obj={},result=[];
for(i=0;i<arr1.length;i++)obj[arr1[i].name]=arr1[i].value;
for(i=0;i<arr2.length;i++)obj[arr2[i].name]=arr2[i].value;
for(p in obj)if(obj.hasOwnProperty(p))result.push({name:p,value:obj[p]});
// result: [{name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'}]
Andrew D.
quelle
Array.concat ist der richtige Weg, um zwei Arrays zu einem zusammenzuführen. Ich mag auch die erweiterte Annahme, dass das Konzept der "wahren" Zusammenführung angesprochen wurde (basierend auf einem bestimmten Schlüssel jedes Array-Elements).
Bob
14

Der einfachste Weg ist mit etwas ES6-Magie:

Füge zwei mit Duplikaten zusammen:

const a = [{a: 1}, {b: 2}]
const b = [{a: 1}]

const result = a.concat(b) // [{a: 1}, {b: 2}, {a: 1}]

Ohne Duplikate ist es dasselbe wie das obige Plus:

const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]

Knikolov
quelle
1
concat funktioniert nicht mit Gegenständen unterschiedlicher Art
fdsfdsfdsfds
7

Mit lodash:

_.uniqBy([...arr1, ...arr2], 'name')
Pietro
quelle
Diese ES6-Syntax funktioniert mit 2 Arrays, nicht mit 2 Arrays von Objekten.
Dario
7

So habe ich ein ähnliches Problem in einem ES6-Kontext angegangen:

function merge(array1, array2, prop) {
    return array2.map(function (item2) {
        var item1 = array1.find(function (item1) {
            return item1[prop] === item2[prop];
        });
        return Object.assign({}, item1, item2);
    });
}

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.

function mergeArrays(arrays, prop) {
    const merged = {};

    arrays.forEach(arr => {
        arr.forEach(item => {
            merged[item[prop]] = Object.assign({}, merged[item[prop]], item);
        });
    });

    return Object.values(merged);
}

var arr1 = [
    { name: 'Bob', age: 11 },
    { name: 'Ben', age: 12 },
    { name: 'Bill', age: 13 },
];

var arr2 = [
    { name: 'Bob', age: 22 },
    { name: 'Fred', age: 24 },
    { name: 'Jack', age: 25 },
    { name: 'Ben' },
];

console.log(mergeArrays([arr1, arr2], 'name'));
marktuk
quelle
6

Noch eine andere Version mit reduce() method:

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

var arr = arr1.concat(arr2).reduce(function(prev, current, index, array){ 
   
   if(!(current.name in prev.keys)) {
      prev.keys[current.name] = index;
      prev.result.push(current);   
   } 
   else{
       prev.result[prev.keys[current.name]] = current;
   }  

   return prev;
},{result: [], keys: {}}).result;
  
document.getElementById("output").innerHTML = JSON.stringify(arr,null,2);    
<pre id="output"/>

Vadim Gremyachev
quelle
Das hat bei mir super funktioniert. Ein kleines Problem ist jedoch, dass die Reihenfolge manchmal ungerade ist, wenn 3 große
JSON-
5

Einfache Lösung

var tx = [{"id":1},{"id":2}];
var tx1 = [{"id":3},{"id":4}];


var txHistory = tx.concat(tx1)

console.log(txHistory); 
// output
 // [{"id":1},{"id":2},{"id":3},{"id":4}];
Shashwat Gupta
quelle
4

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:

function merge(args) {
    args  = Array.prototype.slice.call(arguments);
    var o = { };
    for(var i = 0; i < args.length; ++i)
        for(var j = 0; j < args[i].length; ++j)
            o[args[i][j].name] = args[i][j].value;
    return o;
}

function expand(o) {
    var a = [ ];
    for(var p in o)
        if(o.hasOwnProperty(p))
            a.push({ name: p, value: o[p]});
    return a;
}

var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
var arr3 = expand(merge(arr1, arr2));

Ich weiß nicht, ob dies der schnellste Weg ist, aber er funktioniert für eine beliebige Anzahl von Eingabearrays. Zum Beispiel:

var a = expand(
    merge(
        [{name: "lang", value: "English"}, {name: "age", value: "18"}],
        [{name: "childs", value: '5'}, {name: "lang", value: "German"}],
        [{name: 'lang', value: 'Pancakes'}]
    )
);

Gibt dir das gleiche, was drin awararr3 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/

mu ist zu kurz
quelle
2

Was ist mit jQuery Merge?

http://api.jquery.com/jQuery.merge/

jsFiddle Beispiel hier: http://jsfiddle.net/ygByD/

321X
quelle
Das wird Englisch nicht wie angegeben durch Deutsch ersetzen, die Zusammenführung findet entlang der nameEigenschaften statt.
Mu ist zu kurz
AH ja, du hast recht! Ich habe diese Spezifikation nicht auf einen Blick gesehen!
321X
+1. Gut! Auf der anderen Seite ist es eine gute Funktion, Javascript-Arrays von Objekten zusammenzuführen
Muhammad Raheel
2

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 .

/**
 * Merges two object-like arrays based on a key property and also merges its array-like attributes specified in objectPropertiesToMerge.
 * It also removes falsy values after merging object properties.
 *
 * @param firstArray The original object-like array.
 * @param secondArray An object-like array to add to the firstArray.
 * @param keyProperty The object property that will be used to check if objects from different arrays are the same or not.
 * @param objectPropertiesToMerge The list of object properties that you want to merge. It all must be arrays.
 * @returns The updated original array.
 */
function merge(firstArray, secondArray, keyProperty, objectPropertiesToMerge) {

    function mergeObjectProperties(object, otherObject, objectPropertiesToMerge) {
        _.each(objectPropertiesToMerge, function (eachProperty) {
            object[eachProperty] = _.chain(object[eachProperty]).union(otherObject[eachProperty]).compact().value();
        });
    }

    if (firstArray.length === 0) {
        _.each(secondArray, function (each) {
            firstArray.push(each);
        });
    } else {
        _.each(secondArray, function (itemFromSecond) {
            var itemFromFirst = _.find(firstArray, function (item) {
                return item[keyProperty] === itemFromSecond[keyProperty];
            });

            if (itemFromFirst) {
                mergeObjectProperties(itemFromFirst, itemFromSecond, objectPropertiesToMerge);
            } else {
                firstArray.push(itemFromSecond);
            }
    });
    }

    return firstArray;
}

_.mixin({
            merge: merge
        });

Hoffe es ist nützlich! Grüße!

Nahuel Barrios
quelle
2

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:

function find(objArr, keyToFind){
    var foundPos = objArr.map(function(ob){
        return ob.type;
    }).indexOf(keyToFind);
    return foundPos;
}

function update(arr1,arr2){
    for(var i = 0, len = arr2.length, current; i< len; i++){
        var pos = find(arr1, arr2[i].name); 
        current = arr2[i];
        if(pos !== -1) for(var key in arr2) arr1[pos][key] = arr2[key];
        else arr1[arr1.length] = current;
    } 
}

Dies hält auch die Reihenfolge von arr1 aufrecht.

Amin Mohamed Ajani
quelle
2

Sie könnten folgende Funktion verwenden

const merge = (a, b, key = "id") =>
  a.filter(elem => !b.find(subElem => subElem[key] === elem[key]))
   .concat(b);

und versuche

merge(arr1, arr2, 'name');
Diogo Alves
quelle
Dank Diago Weg mit ES6 unveränderlichen Feature `` `export const mergeArrays = (a1, a2, key =" id ") => a1 && a2! = Null? [... a1.filter (a =>! a2.find (p => p [key] === a [key])), ... a2]: null; `` `
Musa
1

Hier filtere ich zuerst arr1basierend auf dem Element, das in vorhanden ist arr2oder nicht. Wenn es vorhanden ist, fügen Sie es nicht zum resultierenden Array hinzu, andernfalls fügen Sie es hinzu. Und dann hänge ich arr2an das Ergebnis.

arr1.filter(item => {
  if (!arr2.some(item1=>item.name==item1.name)) {
    return item
  }
}).concat(arr2)
maulik bhatt
quelle
Bitte erklären Sie Ihre Antwort. Wenn also eine andere Person die Frage und Antwort liest, kann sie leicht verstanden werden.
Mittal Patel
Obwohl diese Antwort wahrscheinlich richtig und nützlich ist, wird es bevorzugt, wenn Sie eine Erklärung hinzufügen, um zu erklären, wie sie zur Lösung des Problems beiträgt. Dies ist in Zukunft besonders nützlich, wenn eine Änderung (möglicherweise ohne Bezug) dazu führt, dass sie nicht mehr funktioniert und Benutzer verstehen müssen, wie sie einmal funktioniert hat.
Erty Seidohl
Danke Jungs. Ich habe die Lösungsbeschreibung aktualisiert. Wenn es richtig scheint pls upvote :)
maulik bhatt
0

Aus dem Kopf - versuchen Sie es mit jquery verlängern

var arr3 = jQuery.extend(arr1,arr2....)
Xhalent
quelle
Es tut uns leid. Genau diese Funktion gibt arr4 zurück. Nicht $ .merge. Der letzte passt auch nicht zu mir, weil er Objekte dupliziert.
Alexander
0

var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);

javaScriptBeard
quelle
Ich bin damit einverstanden, dass dies viel sinnvoller ist als die Array.protype.push.apply()Antwort, aber es führt nicht die Zusammenführung durch, wie OP es wollte.
Keithpjolley
Sie können die Ausgabe mit 'concat' nicht übertreffen, wenn Sie zwei Zusammenführungsarrays von Objekten haben. Bitte überprüfen Sie dies aus jsfiddle.net/jahanzaibaslam/z22n5tuo
Jahanzaib Aslam
0

Basierend auf der Antwort von @ YOU, aber unter Beibehaltung der Reihenfolge:

var arr3 = [];
for(var i in arr1){
   var shared = false;
   for (var j in arr2)
       if (arr2[j].name == arr1[i].name) {
           arr3.push(arr1[j]
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr1[i])
}

for(var j in arr2){
   var shared = false;
   for (var i in arr1)
       if (arr2[j].name == arr1[i].name) {
           shared = true;
           break;
       }
   if(!shared) arr3.push(arr2[j])
}
arr3

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.

hcarreras
quelle
0

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.

(function($) {
  $.extendObjectArray = function(destArray, srcArray, key) {
    for (var index = 0; index < srcArray.length; index++) {
      var srcObject = srcArray[index];
      var existObject = destArray.filter(function(destObj) {
        return destObj[key] === srcObject[key];
      });
      if (existObject.length > 0) {
        var existingIndex = destArray.indexOf(existObject[0]);
        $.extend(true, destArray[existingIndex], srcObject);
      } else {
        destArray.push(srcObject);
      }
    }
    return destArray;
  };
})(jQuery);

var arr1 = [
  { name: "lang",   value: "English" },
  { name: "age",    value: "18"      }
];
var arr2 = [
  { name: "childs", value: '5'       },
  { name: "lang",   value: "German"  }
];
var arr3 = $.extendObjectArray(arr1, arr2, 'name');

console.log(JSON.stringify(arr3, null, 2));
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


ES6-Version

(function($) {
  $.extendObjectArray = (destArr, srcArr, key) => {
    srcArr.forEach(srcObj => (existObj => {
      if (existObj.length) {
        $.extend(true, destArr[destArr.indexOf(existObj[0])], srcObj);
      } else {
        destArr.push(srcObj);
      }
    })(destArr.filter(v => v[key] === srcObj[key])));
    return destArr;
  };
})(jQuery);
Mr. Polywhirl
quelle
0

Mit lodash möchten Sie _.uniqBy

var arr3 = _.uniqBy(arr1.concat(arr2), 'name'); // es5

let arr3 = _.uniqBy([...arr1, ...arr2], 'name'); // es6

Reihenfolge von arr1, arr2 zählt!

Siehe Dokumente https://lodash.com/docs/4.17.4#uniqBy

danday74
quelle
Müssen Sie Dritte verwenden?
Nguyễn Xuân Hoàng
Nein, aber es ist der prägnanteste Weg, dies zu erreichen, und es ist nicht irgendein Dritter, sein Lodash!
danday74
0
const extend = function*(ls,xs){
   yield* ls;
   yield* xs;
}

console.log( [...extend([1,2,3],[4,5,6])]  );
codemonkey
quelle
2
Geben Sie einfach keine Antwort auf die Frage. Erklären Sie auch, wie diese Lösung das Problem löst.
Mittal Patel
0
merge(a, b, key) {
    let merged = [];
    a.forEach(aitem => {
        let found = b.find( bitem => aitem[key] === bitem[key]);
        merged.push(found? found: aitem);
    });
    return merged;
}
Kyaw
quelle
0

Wenn Sie die beiden Arrays zusammenführen möchten, aber doppelte Objekte entfernen möchten, verwenden Sie diese Option. An .uniqueIdjedem Objekt werden Duplikate identifiziert

function mergeObjectArraysRemovingDuplicates(firstObjectArray, secondObjectArray) {
  return firstObjectArray.concat(
    secondObjectArray.filter((object) => !firstObjectArray.map((x) => x.uniqueId).includes(object.uniqueId)),
  );
}
daveanderson88
quelle
0

Versuche dies:

var a = [{"a":20, "b":10,"c":"c","d":"asd","f":"any"}]
var b = [{"a":20, "b":10,"c":"c", "e":"nan","g":10200}]

var p = []
_.map(a, function(da){
var chk = _.filter(b, function(ds){
return da.a ===ds.a
})[0]
p.push(_.extend(da, chk))


})

console.log(p)

OutPut wird sein:

  [{
    "a": 20,
    "b": 10,
    "c": "c",
    "d": "asd",
    "f": "any",
    "e": "nan",
    "g": 10200
  }]
Rohit Parte
quelle
0
const arr1 = ["Vijendra","Singh"];
const arr2 = ["Singh", "Shakya"];

arr2.forEach(item => {
        if(!arr1.find(k => k===item))
          arr1.push(item)
    });


console.log(arr1)
Gajju
quelle
0

Lösung mit JS Map:

const merge = (arr1, arr2, prop) => {
    const resultMap = new Map([...arr1.map((item) => [item[prop], item])]);
    arr2.forEach((item) => {
        const mapItem = resultMap.get(item[prop]);
        if (mapItem) Object.assign(mapItem, item);
        else resultMap.set(item[prop], item);
    });
    return [...resultMap.values()];
};

const arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
const arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});

console.log(merge(arr1, arr2, "name"));

Welches produziert:

Ergebnis der Funktion merge ()

2DH
quelle
0
const array1 = [{id:1,name:'ganza'},
{id:2,name:'respice dddd'},{id:4,name:'respice dddd'},{id:6,name:'respice dddd'},
{id:7,name:'respice dddd'}];
const array2 = [{id:1,name:'ganza respice'},{id:2,name:'respice'},{id:3,name:'mg'}];

 function mergeTwoArray(array1,array2){

    return array1.map((item,i)=>{
        if(array2[i] && item.id===array2[i].id){
          return array2[i];
          }else{
            return item;
          }
    });
  }

const result = merge(array1,array2);
console.log(result);
//here is the result:  Array [Object { id: 1, name: "ganza respice" }, Object { id: 2, name: "respice" }, Object { id: 4, name: "respice dddd" }, Object { id: 6, name: "respice dddd" }, Object { id: 7, name: "respice dddd" }]
Ganza Antwort
quelle