JS 数组中对象 某属性相同对某属性的值进行相加去重(支持多条件多个值判断相加)

/*  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);
};

验证:单条件判断

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']));

在这里插入图片描述

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']));

在这里插入图片描述
可以在后边的计算中直接用这个进行求和复制或者校验总和比对。
我的这需求中就有用到

猜你喜欢

转载自blog.csdn.net/lzfengquan/article/details/132510948