2016-01-14 24 views
5

Czy istnieje lepszy sposób na iteracje na dwóch tablicach obiektów niż to, co zrobiłem poniżej? Wydaje się nieporządnym robić to w ten sposób. Używam lodasha.Zagnieżdżone dla wszystkich pętli, aby dodać obiekt do istniejącego obiektu 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'} 
]; 

Przykâadowa:

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

Funkcja:

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

Najpierw konwertuj jedną z tablic na mapę "id -> osoba"? –

+0

Możliwy duplikat [Funkcjonalnej metody łączenia dwóch macierzy obiektów js na podstawie wspólnego identyfikatora] (http://stackoverflow.com/questions/23591371/functional-way-of-joining-two-js-object-arrays-based-on -common-id) – nograde

+0

Odpowiedź Gruff Bunny (link powyżej) jest dość wyczerpująca. – nograde

Odpowiedz

6

Ponieważ używasz lodash, można użyć _.find() method aby znaleźć odpowiedni obiekt w array2 oparciu o właściwości id .

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

Warto podkreślić, że spowoduje to nieokreślonej person własności, jeśli obiekt nie został znaleziony. Jeśli jest to problem, po prostu sprawdzić, czy jest zwracany obiekt:

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

Bez lodash, byłoby dość podobny:

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

Chciałbym zbudować obiekt porównawczy i dodać do niej, że nie ładujesz drugiej tablicy N razy. Coś takiego:

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]; 
     } 
    } 

Daje to obiekt o właściwościach obu tablicach, takich jak:

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

Z korzyścią, że tylko iteracyjne nad każdej tablicy raz.