2014-12-18 48 views
6

我有對象的一個​​這樣的數組:我如何可以合併對象的數組下劃線JS

array1 = [ 
    {field: 'username', display: 'username', hide: true}, 
    {field: 'age', display: 'Age', hide: true}, 
    {field: 'height', display: 'Height', hide: true} 
] 

然後,我有數組2:

array2 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', hide: false} 
] 

我想通過這兩個數組合並他們的場即最後的結果應該是:

array3 = [ 
    {field: 'username', display: 'username 123', hide: false}, 
    {field: 'age', display: 'Age', hide: false}, 
    {field: 'height', display: 'Height', hide: true} 
] 

我試圖var newObj = _.extend(array1, array2);但它並沒有給我我想要的東西。

+0

您正在尋找concat。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat – Brian 2014-12-18 22:24:18

+0

@Brian:不,他正在做某種更新。 – 2014-12-18 22:25:27

+0

@Karoly Horvath是的,他想合併對象以及數組 – Brian 2014-12-18 22:26:47

回答

10

沒有一個功能可以做到,因爲它是一個相當專業化的操作。然而,它的下劃線功能相當簡單的構圖:

_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))) 

我們使用indexBy打開陣列成鍵的field值對象,然後extend做我們想要的。最後,values將它變回一個數組。

注意的是,雖然這不作任何保證有關訂單,在目前_和V8實現最終的陣列將是array1隨後事情的東西從array2不在array1,在整理每個陣列的原始排序。

另請注意,_.extend函數對第一個參數具有破壞性,但這不會更改任何數組。

如果你想確保順序是一樣的原始array1

order = _.object(_.map(array1, function(obj, i) { return [obj.field, i]; })) 
_.sortBy(_.values(_.extend(_.indexBy(array1, 'field'), _.indexBy(array2, 'field'))), function(obj) { order[obj.field]; }) 

在這裏,我們做位置的查找表,然後進行排序基於查找表最初的解決方案。

+0

謝謝,那正是我想要的。我如何保存訂單。我的意思是我希望那個訂單應該保持在第一個數組中。第二個數組不會有任何新的元素。其唯一更新 – user3214546 2014-12-18 22:32:43

+0

絕對優秀的答案! – 2016-10-10 15:29:11

+0

我有2個列表:[{「image_id」:631293,「score」:73},{「image_id」:11848407,「score」:56}]' 第二個是'[{ :631293,「article_id」:173},{「image_id」:11848407,「article_id」:121}' 如果我嘗試應用您的方法,它不會更改任何內容 – Toucouleur 2016-11-21 16:59:13

相關問題