从对象中删除重复项目,如果存在重复项,则获取密钥总和

时间:2016-12-16 11:49:57

标签: javascript jquery lodash

我有一组对象。

var $arr = [
    {'product': 1, 'quantity': 4, 'service': 'AC'},
    {'product': 2, 'quantity': 5, 'service': 'TV'},
    {'product': 1, 'quantity': 3, 'service': 'AC'}
];

使用此数组我需要删除“product”和“service”键都匹配的任何对象。我需要做的另一件事是,如果两个或多个对象之间存在匹配,则取每个对象的“数量”值并计算总和。

我一直在用lodash来试图欺骗这个。虽然我觉得我找到一个解决方案并不是太遥远,但我似乎无法确定问题的最后一部分,并且如果匹配则将“数量”值相加在一起。

console.log(_.uniqBy($arr, function(v) {
    return v.product === 1;
}));

这是否可行或我是否需要重新考虑我对此问题的处理方法。另外,我很担心我无法使用ES6,这是一种耻辱。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用_.groupBy()收集具有相同产品和服务值的对象到数组,然后使用_.mergeWith()将每个数组合并为一个。

该示例使用ES6箭头函数和数组传播:

var $arr = [{"product":1,"quantity":4,"service":"AC"},{"product":2,"quantity":5,"service":"TV"},{"product":1,"quantity":3,"service":"AC"}];

var result = _($arr)
  // group the object by product and service
  .groupBy(({ product, service }) => product + service)
   // merge each group, and if the key is quantity add the numbers
  .map((g) => _.mergeWith(...g, (o, s, k) => k === 'quantity' ? o + s : o))
  .value();

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