2016-12-16 5 views
0

私は以下のことを忘れました。Lodashを使って2つのコレクションをフィルタリングする

newPriceList:

[{id:1, updatedPrice:22}, {id:4, updatedPrice:23}] 

currPriceList:私は2つのオブジェクトを持っているオブジェクトが更新価格を持って

[{id:1, price:200, name:"carrot}, {id:2, price:100, name:apple}] 

ない場合は、その後価格は同じままならば、価格は、更新されます。理想的には私はこのようになり、結果返したい:これを行うには

[{id:1, price:22},{id:2, price:100}, {id:3, price:23}] 

を、私は、しかし、私が把握することができないよう変わらず価格のリストを取得し、新しい価格にそれを追加しています変更されていない価格のリストを取得する方法。私はまた、これをすべて1ステップで行うことが可能かどうか疑問に思います。

var unChangedPrices = _(currPriceList).reject('id').at(newPriceList.id); 

答えて

2

あなたは「価格」に「updatedPriceを」名前を変更することができる場合、これはこの

_.forEach(p1, function(obj){ 
    _.merge(_.find(p2, {"id": obj.id}), obj) 
}); 

のように簡単に行うことができます。これは、あなたが名前を変更しない場合は、それがどのように見えるかです

enter image description here

更新:

そのidは

_.forEach(p1, function(obj){ 
    var p2Obj = _.find(p2, {"id": obj.id}); 
    if(p2Obj){ 
     _.merge(p2Obj, obj); 
    }else{ 
     p2 = _.concat(p2,[p2Obj]); 
    } 
}); 
+0

と一致しない場合でも、この答えはかなり良いと簡単なようで、私の唯一の問題は、マージが唯一の2つの結果の代わりに、3を返すことで、P2に含まP1のすべてを持っているために、これを使用します? – lost9123193

+0

@ lost9123193答えを更新しました –

+0

ありがとうございました!私はlodash 3を使っています。私は_.concatを持っていません。これがまだ可能であれば、私は見るでしょう。 – lost9123193

1
var res = _.map(currPriceList, function(item) { // thru each item 
    return _.chain(newPriceList) 
     .find({id: item.id}) // find item from new list 
     .thru(function(newItem) { 
      if (!_.isUndefined(newItem)) { 
       item = _.merge({}, item, { 
        price: newItem.updatedPrice // set value from new item 
       }); 
      } 
      return _.omit(item, 'name'); // remove name key 
     }) 
     .value(); 
}); 
関連する問題