我工作的过程中,遇到一个场景。循环调用同一个接口,然后需要对返回的结果做聚合操作,将每个对象中的属性都累加起来。对应的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)