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