var arr =[{a:1,b:2,c:2},{a:1,b:2,c:3},{a:2,b:3,c:2},{a:2,b:3,c:2},{a:1,b:4,c:2}];
arr 是个多维数组,每个数组里面有多个属性abcde……,我举例只写了abc3个属性,
我想实现遍历数组后,当a和b的属性值相同的时候(只要求a和b),那么就把他们的c相加,
最终实现数组是
arr2 =[{a:1,b:2,c:5},{a:2,b:3,c:4},{a:1,b:4,c:2}];
var arr =[{a:1,b:2,c:2},{a:1,b:2,c:3},{a:2,b:3,c:2},{a:2,b:3,c:2},{a:1,b:4,c:2}];
arr 是个多维数组,每个数组里面有多个属性abcde……,我举例只写了abc3个属性,
我想实现遍历数组后,当a和b的属性值相同的时候(只要求a和b),那么就把他们的c相加,
最终实现数组是
arr2 =[{a:1,b:2,c:5},{a:2,b:3,c:4},{a:1,b:4,c:2}];
var arr = [{a: 1, b: 2, c: 2}, {a: 1, b: 2, c: 3}, {a: 2, b: 3, c: 2}, {a: 2, b: 3, c: 2}, {a: 1, b: 4, c: 2}];
//要做对比的键名数组
const attrs = ['a', 'b'];
const result = arr.reduce((list, o) => {
const item = list.find(n => !attrs.find(attr => o[attr] !== n[attr]));
!item ? list.push({...o}) : item.c += o.c;
return list;
}, []);
console.log(result)
这个问题本质上是一个SQL
语句里的分组求和(SUM and GROUP BY)问题,既然如此,不妨动用牛刀杀鸡:
npm install --save alasql
然后:
var alasql = require('alasql');
var arr =[{a:1,b:2,c:2},{a:1,b:2,c:3},{a:2,b:3,c:2},{a:2,b:3,c:2},{a:1,b:4,c:2}];
var res = alasql('SELECT a, b, SUM(c) AS c FROM ? GROUP BY a, b', [arr]);
console.log(res);
结果:
[ { a: 1, b: 2, c: 5 },
{ a: 2, b: 3, c: 4 },
{ a: 1, b: 4, c: 2 } ]
const arr = [
{ a: 1, b: 2, c: 2 },
{ a: 1, b: 2, c: 3 },
{ a: 2, b: 3, c: 2 },
{ a: 2, b: 3, c: 2 },
{ a: 1, b: 4, c: 2 }
];
const result = arr.reduce((agg, item) => {
const found = agg.find(t => t.a === item.a && t.b === item.b);
if (found) {
found.c += item.c;
} else {
agg.push({...item});
}
return agg;
}, []);
console.log(result);
写完了发现跟 @asseek 的思路差不多。
不过 @asseek 的 attrs.find()
可以改成 attrs.every()
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答860 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决
如有错误,还望指正,大神轻喷
更新几点: