封装成了个方法
该方法可以判断多个条件 同时支持多个值相加 (综合下方评论进行的优化)
看下参数说明哟!
/* delSameObjValue 数组对象相同值相加去重
arr 需要处理的数组
resultNum 最终计算结果的键名
keyName 用于计算判断的键名
keyValue 用于计算结果的键名 --> 对应的键值为number类型*/
function delSameObjValue(arr, resultNum, keyName, keyValue) {
const warp = new Map();
arr.forEach(i => {
let str = keyName.map(v => i[v]).join('_');
i[resultNum] = keyValue.reduce((p, c) => p += i[c], 0);
warp.has(str) ? warp.get(str)[resultNum] += i[resultNum] : warp.set(str, i);
});
return Array.from(warp).map(([, v]) => v);
};
下面看实践 -----> 首先单个判断条件 下面用id相同的计算举例
const testArr = [{ id: 11, num: 10 },
{ id: 11, num: 20 },
{ id: 22, num: 30 },
{ id: 33, num: 10 },
{ id: 11, num: 20 },
{ id: 22, num: 10 },
{ id: 44, num: 10 }];
console.log(delSameObjValue(testArr, 'resultNum', ['id'], ['num']));
输出结果 --> 可以看到最终结果键名为 resultNum (该键名可修改 看该计算函数的参数说明) 完成了条件运算
多个判断条件实践 ----> 多个判断条件和多个相加值 (id,status相同的计算条件 value ,num )
let arr = [{ id: '112', status: '运行', value: 1125, num: 11 },
{ id: '112', status: '运行', value: 165, num: 11 },
{ id: '112', status: '离线', value: 125, num: 22 },
{ id: '112', status: '待机', value: 115, num: 33 },
{ id: '112', status: '待机', value: 135, num: 11 },
{ id: '113', status: '运行', value: 105, num: 22 },
{ id: '113', status: '运行', value: 325, num: 22 },
{ id: '113', status: '运行', value: 305, num: 22 },
{ id: '113', status: '离线', value: 5, num: 22 },
{ id: '113', status: '待机', value: 112, num: 22 },
{ id: '113', status: '待机', value: 125, num: 22 },
{ id: '113', status: '运行', value: 195, num: 33 },
{ id: '113', status: '运行', value: 1125, num: 22 },
{ id: '113', status: '运行', value: 15, num: 11 },
{ id: '113', status: '离线', value: 175, num: 22 },
{ id: '113', status: '待机', value: 185, num: 22 },
{ id: '113', status: '待机', value: 165, num: 33 },
{ id: '113', status: '运行', value: 355, num: 44 }];
console.log(delSameObjValue(arr, 'resultNum', ['id', 'status'], ['num', 'value']));