使用lodash基于不同值的Sum属性

时间:2016-10-17 01:47:13

标签: javascript lodash uniq

如何制作我的数据:

[
  {
    "a": {
      "b": 1,
      "c": "M"
    },
    "color": "white"
  },
  {
    "a": {
      "b": 10,
      "c": "M"
    },
    "color": "white"
  }
]

进入这个:

[
  {
    "a": {
      "b": 11,
      "c": "M"
    },
    "color": "white"
  }
]

我希望a.ccolor字段是唯一的,a.b要合并。

我尝试使用_.uniq,但它无效。我正在使用lodash 3.10.1。

2 个答案:

答案 0 :(得分:2)

不是微不足道的,但在这里:

// assuming the data is in `data`:
_.map(_.groupBy(data, x => [x.a.c, x.color]),
      x => _.tap(_.cloneDeep(x[0]), y => y.a.b = _.sum(x, z => z.a.b)))

首先,我按照.a.c.color的复合值对对象进行分组;在每个组中,我将第一个对象克隆为结果,然后使用组中所有.a.b值的总和覆盖其.a.b值。

编辑:用包装语法:

_(data).groupBy(x => [x.a.c, x.color]).map(x =>
  _.tap(_.cloneDeep(x[0]), y => y.a.b = _.sum(x, z => z.a.b))
).value()

答案 1 :(得分:0)

另一种方法:

var f = [{
  "a": {
    "b": 1,
    "c": "M"
  },
  "color": "white"
}, {
  "a": {
    "b": 10,
    "c": "M"
  },
  "color": "white"
}];

var res = _.reduce(f, (memo, o) => {
  var already = _.find(memo, o1 => o.a.c === o1.a.c || o.color === o1.color);
  return already ? (already.a.b += o.a.b, memo) : memo.concat(o);
}, []);

console.log(res);
<script src="https://cdn.jsdelivr.net/lodash/3.10.0/lodash.min.js"></script>

这里的想法是拥有一个数组(结果数组),我们在其中拥有唯一的对象。然后我们迭代原始数组:如果迭代的当前对象在结果数组中,我们更新值并且不添加任何内容。如果不是,我们只需添加它。

希望它有所帮助。