用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)
结果如下:
