2016-12-16 62 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(); 
});