2015-06-19 62 views
0

我有兩個集合。LoDash - 如何通過公鑰將一個集合值推入另一個值

var a = 
[ 
{unique_id: "001", state: "CO"}, 
{unique_id: "001", state: "TX"}, 
{unique_id: "001", state: "CC"}, 
{unique_id: "002", state: "CC"}, 
{unique_id: "002", state: "NY"} 
] 

而且

var b = 
[ 
{unique_id: "001", states:[]}, 
{unique_id: "002", states:[]} 
] 

而且我想:

var b = 
[ 
{unique_id: "001", states:["CO","TX","CC"]}, 
{unique_id: "002", states:["CC","NY"]} 
] 

我應該提到的是,「B」數組必須留在它以同樣的順序和部分的unique_id沒有任何價值。

我一直在嘗試使用LoDash https://lodash.com/ - 所以如果任何人都可以用LoDash解決這個問題,那真是太棒了!

+0

你試過做什麼?我不會告訴你,雖然有人可能! –

+0

我試過_.forEach和_.forIn與Lodash,但似乎無法弄清楚如何匹配將值推入「B」unique_id ... –

回答

3

這種解決方案的時間複雜度爲次優(O(N^2)),但它可以幫助你想辦法,以配合推動值到「B」:

_.forEach(a, function(element1){ 
    _.forEach(b, function(element2){ 
    if (element2.unique_id === element1.unique_id) { 
    element2.states.push(element1.state); 
    } 
    }); 
}); 

也許是更好的解決方案可能會使用lodash的_.indexBy方法通過其唯一標識將b中的對象編入索引。例如,你可以索引b中的對象如下:

var c = _.indexBy(b, 'unique_id') 

這將導致:

{001:{unique_id: "001", states:[]}, 002: {unique_id: "002", states:[]}} 

因爲在我們的C數組對象都指向同一個對象在內存中那些我們在b數組中,我們可以直接改變c和b中的對象,並將引用內存中的更新對象。所以:

_.forEach(a, function(element1){ 
    if (element1.unique_id in c) { 
    c[element1.unique_id].states.push(element1.state); 
    } 
}) 

現在,如果我們看一看我們的B陣列中,我們將看到該值:

var b = 
[ 
{unique_id: "001", states:["CO","TX","CC"]}, 
{unique_id: "002", states:["CC","NY"]} 
] 

這種解決方案的時間複雜度應接近O(N) ,這比使用嵌套的方法好得多。代碼片段:

var a = 
 
[ 
 
{unique_id: "001", state: "CO"}, 
 
{unique_id: "001", state: "TX"}, 
 
{unique_id: "001", state: "CC"}, 
 
{unique_id: "002", state: "CC"}, 
 
{unique_id: "002", state: "NY"} 
 
]; 
 

 
var b = 
 
[ 
 
{unique_id: "001", states:[]}, 
 
{unique_id: "002", states:[]} 
 
]; 
 

 
var c = _.indexBy(b, 'unique_id'); 
 

 
_.forEach(a, function(element1){ 
 
    if (element1.unique_id in c) { 
 
    c[element1.unique_id].states.push(element1.state); 
 
    } 
 
}); 
 

 
document.writeln(JSON.stringify(b))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.js"></script>

+0

謝謝,但我試過_.indexBy和它排序的一切,我需要「B」陣列保持在它的相同順序(這是很難解釋).. –

+0

嗯......我有點困惑。 _.indexBy產生一個新的對象,並不會改變它所需的數組。在我的例子中,「b」將保留它的原始順序。 –

+0

那麼......我沒有提到的另一件事是,「b」數組中的一些對象對於unique_id具有空值... –

2

groupBy()map()是你的朋友:

_(a).groupBy('unique_id') 
    .map(function(item, key) { 
     return { 
      unique_id: key, 
      states: _.pluck(item, 'state') 
     }; 
    }) 
    .value() 

你基本上由他們unique_id分組狀態,然後繪製該對象數組,其中每個物品有你需要的結構。

相關問題