2016-04-18 20 views
4

Ich brauche Arrays von Objekten in browserside zu verschmelzen javascript wie folgt aus:Merge Array von Objekten

[ 
    {name: "john", age: 10}, 
    {name: "doe", age: 14} 
] 

-> neue Daten ankommen

[ 
    {name: "pete", age: 88}, 
    {name: "larry", age: 42} 
] 

sollte

[ 
    {name: "john", age: 10}, 
    {name: "doe", age: 14}, 
    {name: "pete", age: 88}, 
    {name: "larry", age: 42} 
] 

Nun werden Das vereinfacht die Arrays werden Hunderte von größeren Objekten enthalten. Daher brauche ich eine performante Lösung.

Vielen Dank im Voraus Ihr skeec

+3

[ 'concat'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ concat)? ['push'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)? Eine einfache Schleife? Wird nicht besser werden. – Bergi

+0

Afaik concat funktioniert nicht mit Arrays, die Objekte enthalten, richtig? – Skeec

+1

Sicher, warum nicht? 'data = data.concat (newData)' – Bergi

Antwort

4

Es scheint, dass Sie nur .push() oder .concat() zu kombinieren, um die beiden Arrays verwenden können. Es spielt keine Rolle, was in den Arrays ist, da die Array-Operatoren nur abstrakt an den Elementen des Arrays arbeiten, ohne zu wissen, was in ihnen ist.

Hier ist eine Lösung, die das neue Array auf die bestehenden ergänzt:

var data = [ 
    {name: "john", age: 10}, 
    {name: "doe", age: 14} 
]; 


var newInfo = [ 
    {name: "pete", age: 88}, 
    {name: "larry", age: 42} 
] 

data = data.concat(newInfo); 

Oder, wenn Sie wirklich wollen, halten das ursprüngliche Array (nicht neu erstellen), können Sie hinzufügen neue Array auf das Ende des ursprünglichen Arrays wie folgt aus:

data.push.apply(data, newInfo); 
+0

Oder 'data.push (... newInfo)' in ES6. – Oriol

+0

Wird ein Array nicht um zusätzliche Dimensionen erweitert? – Skeec

+0

@Skeec - '.push()' fügt nur neue Elemente zum Array hinzu und es kann mehr als ein Argument benötigen. 'data.push.apply (data, newInfo);' ist das gleiche Ergebnis wie 'data.push (newInfo [0], newInfo [1]); 'aber es funktioniert für jede Länge von' newInfo', also nicht müssen die einzelnen Elemente fest codieren. – jfriend00

0
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); 
+3

Warum so kompliziert? OP hat nichts über das Filtern von Namensduplikaten erwähnt. – Bergi

+0

Ja, ich brauche nur einfache Verbindung, danke für Ihre Antwort – Skeec

0

Sie loadash dafür verwenden können:

Etwas wie folgt aus:

var array = [1]; 
var other = _.concat(array, 2, [3], [[4]]); 

console.log(other); 
// → [1, 2, 3, [4]] 

console.log(array); 
// → [1] 

Oder Json können Sie wie folgt verwenden erweitern:

lodash.extend({}, mergeInto, toMerge) 
+0

Es gibt keine Notwendigkeit, Unterstrich/Lodash für etwas so trivial zu verwenden. Vor allem dann nicht, wenn es bereits eine native Methode zur Verkettung gibt. –

3

Angenommen, Sie brauchen nichts anderes, als nur die 2 Arrays zu verketten, es ist äußerst einfach, da Arrays bereits eine Methode zur Verkettung haben.

var arr1 = [ 
    {name: "pete", age: 88}, 
    {name: "larry", age: 42} 
]; 

var arr2 = [ 
    {name: "pete", age: 88}, 
    {name: "larry", age: 42} 
]; 

var concatArr = arr1.concat(arr2); 

MDN Page on Array.prototype.concat