2016-01-14 15 views
5

Gibt es eine bessere Möglichkeit, über zwei Array von Objekten zu iterieren, als was ich unten getan habe? Es scheint unordentlich, es so zu machen. Ich benutze lodash.Geschachtelt forEach Schleifen, um Objekt zu vorhandenem Objekt hinzuzufügen Javascript

var array1 = [ 
    {id:4356, name: 'James', sex: 'male'}, 
    {id:7899, name: 'Jimmy', sex: 'male'}, 
    {id:2389, name: 'Dawn', sex: 'female'} 
]; 

var array2 = [ 
    {id:4356, salary: 1000, job: 'programmer'}, 
    {id:7899, salary: 2000, job: 'tester'}, 
    {id:2389, salary: 3000, job: 'manager'} 
]; 

Beispiel Ausgabe:

console.log(array1[0]) 
{ 
    id:4356, 
    name: James, 
    sex: male, 
    person: { 
     id:4356, 
     salary: 1000, 
     job: programmer 
    } 
} 

Funktion:

_.forEach(array1, function(item1) { 
    _.forEach(array2, function(item2) { 
     if(item1.id === item2.id){ 
      item1.person = item2; 
     } 
    }); 
}); 
+0

Konvertieren Sie eines der Arrays zuerst in eine 'id -> Person'-Karte? –

+0

Mögliches Duplikat von [Funktionale Verknüpfung von zwei js-Objekt-Arrays basierend auf einer gemeinsamen ID] (http://stackoverflow.com/questions/23591371/functionalway-of-joining-two-js-object-arrays-based-on) -common-id) – nograde

+0

Gruff Bunnys Antwort (oben verlinkt) ist ziemlich umfassend. – nograde

Antwort

6

Da Sie verwenden lodash, können Sie die _.find() method verwenden könnte das entsprechende Objekt in array2 basierend auf den id Eigenschaften zu finden .

_.forEach(array1, function(item1) { 
    item1.person = _.find(array2, {id: item1.id}); 
}); 

Es ist erwähnenswert, dass diese in einer undefinierten person Eigenschaft führen, wenn ein Objekt nicht gefunden wird. Wenn das ein Problem ist, einfach um zu sehen, ob ein Objekt zurückgegeben:

_.forEach(array1, function(item1) { 
    var obj = _.find(array2, {id: item1.id}); 
    if (obj) { 
     item1.person = obj; 
    } 
}); 

Ohne lodash, wäre es ziemlich ähnlich sein:

array1.forEach(function(item1) { 
    item1.person = array2.find(function (item2) { 
     return item2.id === item1.id; 
    }); 
}); 
0

würde ich ein Referenzobjekt bauen und um es hinzuzufügen, dass So laden Sie das zweite Array N-mal nicht. Etwas wie folgt aus:

var array1 = [{id:4356, name: 'James', sex: 'male'}, 
     {id:7899, name: 'Jimmy', sex: 'male'}, 
     {id:2389, name: 'Dawn', sex: 'female'} 
    ]; 

    var array2 = [{id:4356, salary: 1000, job: 'programmer'}, 
     {id:7899, salary: 2000, job: 'tester'}, 
     {id:2389, salary: 3000, job: 'manager'} 
    ]; 

    var array3 = {}; 

    for(var i in array1) { 
     array3[array1[i]['id']] = array1[i]; 
    } 

    for(var i in array2) { 
     for(var key in array2[i]) { 
      array3[array2[i]['id']][key] = array2[i][key]; 
     } 
    } 

Dies gibt Ihnen ein Objekt mit den Eigenschaften beider Arrays wie:

Object {2389: Object, 4356: Object, 7899: Object} 

Mit dem Vorteil, dass Sie nur einmal über jedem Array durchlaufen.

Verwandte Themen