2014-05-11 56 views
4

我想用最優雅的(功能)方式獲得類似SQL表加入的東西, ,最好是用underscore.js, ,所以請不要使用for循環。基於公共ID加入兩個js對象數組的功能方式

我需要合併來自兩個不同數組的對象,並使用一個公共標識符進行匹配。

例如,給定:

var basic = [{ 
       id: '1', 
       name: 'someName', 
      }, 
      {...} ] 

var ext= [{ 
       id: '1', 
       job: 'someJob', 
      }, 
      {...} ] 

結果應該是:

var combined = [{ 
       id: '1', 
       name: 'someName', 
       job: 'someJob', 
       }, 
       {...} ] 

謝謝!

+0

什麼問題用'for'循環?你認爲遞歸是以功能方式處理數據結構的唯一方法嗎? – Bergi

回答

3

地圖,findWhere和擴展應該做的伎倆:

var combined = _.map(basic, function(base){ 
    return _.extend(base, _.findWhere(ext, { id: base.id})); 
}); 

編輯

如果性能是一個問題建立擴展值的散列:

var extHash = _.reduce(ext, function(memo, extended, key){ 
    memo[extended.id] = extended; 
    return memo; 
}, {}); 

,並使用像這樣:

var combined = _.map(basic, function(base){ 
    return _.extend(base, extHash[base.id]); 
}); 

Fiddle

+0

由於使用findWhere,我很擔心性能 –

+0

您沒有提到問題中的性能,現在在現代瀏覽器中處理js得到了高度優化。如果你確實有問題,那麼你可以創建一個散列對象的散列,並在地圖中使用它,而不是findWhere。 –

0

NO LOOP:http://jsfiddle.net/abdennour/h3hQt/2/

basic=basic.sort(function(a,b){return a.id-b.id}); 
    ext=ext.sort(function(a,b){return a.id-b.id}); 
    var combined=basic.map(function(e,i){return inherits(e,ext[i]) }); 

知道,inherits如下:

function inherits(base, extension) 
{ 
    for (var property in base) 
    { 
     extension[property] = base[property]; 
    } 
    return extension ; 
} 
+0

'mapWithIndex'和一個標準的'.map()'(或'_.map')有什麼區別? – Bergi

+0

沒錯。 thx for info –

相關問題