2016-08-21 2 views
1

共有プロパティdateにマージしたいオブジェクトweatherpowerの2つの配列があります。ロダッシュでこれを行う方法はありますか?共有キー値ペアのオブジェクトを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フィールド(SO 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

ほとんど、それはまだ 'power'、それは落とされるべきで試合を持っていませんweather''から= 3' '日付を持つオブジェクトが含まれません。私はちょうど 'result'の上を反復し、値がそこにあるかどうか確認することができると思います。私は主にこれを行うためのかなりのバージョンがあるかどうかを尋ねてきました。だから、これを統合するのもいいでしょう。 –

+0

'.filter(function(a){return a.hasOwnProperty( 'weather')&& a.hasOwnProperty( 'power')})を追加すると、これらのプロパティが存在することが確認されます。しかし、より良い解決策があるのだろうか? –

+0

私は両方のインデックスに表示されるプロパティのみをマージするためにpickを使用しました。 –

1

あなたはlodashとほとんどのソリューションを持っているが、あなたが使用することができます単純なJavascriptで、配列のハッシュテーブルと2つのループを持つ提案。

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が実際に働いていますが、私はそれを読みにくいと答えています。しかし、それはちょうど私が新しいES機能にロダッシュするのにもっと慣れているかもしれません。 –

関連する問題