2016-01-14 14 views
5

オブジェクトの2つの配列に対して、以下で行ったことよりも優れた方法がありますか?このようにするのは面倒です。私はロダッシュを使用しています。ネストされた各ループは既存のオブジェクトにオブジェクトを追加する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'} 
]; 

出力例:

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

機能:あなたはlodash使用しているので

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

まず、配列の1つを 'id - > person'マップに変換しますか? –

+0

[共通IDに基づいて2つのjsオブジェクト配列を結合する機能的な方法]の可能な複製(http://stackoverflow.com/questions/23591371/functional-way-of-joining-two-js-object-arrays-based-on -common-id) – nograde

+0

Gruff Bunnyの答え(上記リンク先)はかなり包括的です。 – nograde

答えて

6

、あなたがidプロパティに基づいてarray2で対応するオブジェクトを見つけるために_.find() methodを使用することができます。

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

これは、オブジェクトが見つからない場合は、これは未定義person財産をもたらすと指摘価値があります。

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

lodashがなければ、それはかなり似て次のようになります:

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

私が参照オブジェクトを構築し、それに追加し、ということでしょうそれが問題だ場合は、単にオブジェクトが返されるかどうかを確認しますあなたは2番目の配列をN回ロードしていません。このような何か:あなたは一度だけ、各配列を反復利益で

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

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

これは、あなたのように両方のアレイのプロパティを持つオブジェクトを提供します。

関連する問題