如何制作我的数据:
[
{
"a": {
"b": 1,
"c": "M"
},
"color": "white"
},
{
"a": {
"b": 10,
"c": "M"
},
"color": "white"
}
]
进入这个:
[
{
"a": {
"b": 11,
"c": "M"
},
"color": "white"
}
]
我希望a.c
和color
字段是唯一的,a.b
要合并。
我尝试使用_.uniq
,但它无效。我正在使用lodash 3.10.1。
答案 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>
这里的想法是拥有一个数组(结果数组),我们在其中拥有唯一的对象。然后我们迭代原始数组:如果迭代的当前对象在结果数组中,我们更新值并且不添加任何内容。如果不是,我们只需添加它。
希望它有所帮助。