2016-12-16 87 views
0

我很困惑如何執行以下操作。我有2個對象:使用Lodash過濾2個收藏集

newPriceList:

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

currPriceList:

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

如果一個對象有一個更新的價格,那麼價格進行更新,如果沒有的話,價格保持不變。理想我想返回一個結果,看起來像這樣:

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

要做到這一點,我發現了價格不變的列表,並追加到然而,新的價格,我似乎無法弄清楚如何獲得不變價格的清單。我也想知道是否可以一步完成這一切。

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

更新:

使用此擁有一切包括在P2 P1,即使它的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 ? – 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(); 
});