用lodash解决数组中对象属性的累加及合并

前言

我工作的过程中,遇到一个场景。循环调用同一个接口,然后需要对返回的结果做聚合操作,将每个对象中的属性都累加起来。对应的Value是个数字。此时,我想到了用lodash去处理。

记得npm install lodash哦~

案例

const source = {
          
   
    count:{
          
   
        countOne:{
          
   
            A:2,
            B:100,
        },
        countTwo:33,
    },
    vegetables: [beet]
};

const other = {
          
   
    count:{
          
   
        countOne:{
          
   
            A:2,
            B:100,
        },
        countTwo:33,
    },
    vegetables: [carrot]
};

如果我希望将这两个对象中,各个属性对应的Value进行累加,用lodash可以用mergeWith函数来进行合并:

const mergeWith = require(lodash).mergeWith;
const isArray = require(lodash).isArray;

// objValue和srcValue,这两者为mergeWith(A,B,func)中,A和B的某个Key对应的Value
// 具体的合并逻辑则交给该函数来执行
function customizer(objValue, srcValue) {
          
   
	console.log(objValue, srcValue);
    // 如果是数组,我们将元素进行聚合
    if (isArray(objValue)) {
          
   
        return objValue.concat(srcValue);
    } else if (typeof objValue === object && typeof srcValue === object) {
          
   
        // 若是object类型的对象,我们进行递归
        return mergeWith(objValue, srcValue, customizer)
    } else {
          
   
        // 否则,单纯的将值进行累加
        return objValue + srcValue
    }
}
const res = mergeWith(source, other, customizer)
console.log(res)

结果如下:

可见,每次进入customizer函数中的对象,都是父级对象某个Key对应的Value。并且该Value可能还是个对象,也因此我在代码中写了递归。

那如果是数组合并呢?很简单,改下mergeWith的写法:

const list = [{
          
   
    count: {
          
   
        countOne: {
          
   
            A: 2,
            B: 100,
        },
        countTwo: 33,
    },
    vegetables: [beet]
},{
          
   
    count: {
          
   
        countOne: {
          
   
            A: 2,
            B: 100,
        },
        countTwo: 33,
    },
    vegetables: [beet]
},{
          
   
    count: {
          
   
        countOne: {
          
   
            A: 2,
            B: 100,
        },
        countTwo: 33,
    },
    vegetables: [beet]
}]
const res = mergeWith(...list, customizer)
console.log(res)

结果如下:

经验分享 程序员 微信小程序 职场和发展