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

用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)

结果如下:
用lodash解决数组中对象属性的累加及合并_第1张图片

可见,每次进入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)

结果如下:
在这里插入图片描述

你可能感兴趣的:(常见问题解决,NodeJs,typescript,javascript,node.js)