2016-08-21 47 views
1

我有兩個對象weatherpower我想合併在共享屬性date上的數組。有沒有辦法用lodash做到這一點?合併共享鍵值對上的對象與Lodash

const weather = [ 
    { 
    date: 2, 
    weather: 2 
    }, 
    { 
    date: 1, 
    weather: 1 
    }, 
    { 
    date: 3, 
    weather: 3 
    } 
    ]; 

    const power = [ 
    { 
    date: 1, 
    power: 10 
    }, 
    { 
    date: 2, 
    power: 20 
    }]; 

    const merged = _.merge(weather, power); // <- This does not work as hoped for 

預期的輸出僅包含有一個匹配date字段(因此從weather陣列date: 3對象被丟棄)的對象。

const expected = [{ 
    date: 1, 
    weather: 1, 
    power: 10 
    }, 
    { 
    date: 2, 
    weather: 2, 
    power: 20 
    }]; 

我覺得這應該是可能的unionunionBymerge或類似的,但我無法找到文檔中匹配的例子。

回答

2

使用_.keyBy('date')索引陣列創建索引對象,合併索引,並使用_.values()提取值:

const weather = [{"date":2,"weather":2},{"date":1,"weather":1},{"date":3,"weather":3}]; 
 

 
const power = [{"date":1,"power":10},{"date":2,"power":20}]; 
 

 
const weatherIndex = _.keyBy(weather, 'date'); 
 
const powerIndex = _.keyBy(power, 'date'); 
 

 
const result = _(powerIndex) 
 
    .pick(_.keys(weatherIndex)) 
 
    .merge(_.pick(weatherIndex, _.keys(powerIndex))) 
 
    .values() 
 
    .value(); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

+0

差不多,但是它仍然包括與'日期= 3'從'weather'對象不具有在'power'一場比賽,這應該被丟棄。我想可以迭代'result'again並檢查值是否在那裏。我主要是要求看看是否有一個漂亮的版本可以做到這一點,所以這樣做也很好。 –

+0

添加一個'.filter(function(a){return a.hasOwnProperty('weather')&& a.hasOwnProperty('power')})'確保這些屬性存在。我想知道是否有更好的解決方案?! –

+0

我用pick只合並了兩個索引中出現的屬性。 –

1

雖然你有lodash差不多的解決方案,你可以使用在簡單的Javascript中提供了一個哈希表和兩個數組循環。

var weather = [{ date: 2, weather: 2 }, { date: 1, weather: 1 }, { date: 3, weather: 3 }], 
 
    power = [{ date: 1, power: 10 }, { date: 2, power: 20 }], 
 
    hash = new Map, 
 
    merged = power.map(a => { 
 
     var o = {}; 
 
     Object.assign(o, a); 
 
     hash.set(a.date, o); 
 
     return o; 
 
    }); 
 

 
weather.forEach(a => hash.has(a.date) && Object.assign(hash.get(a.date), a)); 
 
console.log(merged);

+0

+1,因爲它的工作原理,但我發現它很難閱讀,然後lodash答案。但那可能只是我更習慣於接受新的ES功能。 –