如何使用Lodash按键对两个对象或对象数组求和?
使用Lodash按键对对象/对象数组求和的简便方法
当然有!Lodash里的几个工具函数组合起来,就能轻松搞定按键对对象或对象数组的求和需求,我分不同场景给你演示:
1. 两个单个对象按键求和
如果是两个独立对象,想要把相同key对应的数值相加,不同key保留原值,用_.mergeWith最合适——它允许我们自定义属性的合并逻辑。
举个实际例子:
const obj1 = { a: 10, b: 20, c: 30 }; const obj2 = { a: 5, b: 15, d: 25 }; // 封装求和函数 const sumTwoObjects = (objA, objB) => { return _.mergeWith({}, objA, objB, (prevValue, currValue) => { // 只对数字类型的属性求和,其他类型按默认逻辑合并 if (_.isNumber(prevValue) && _.isNumber(currValue)) { return prevValue + currValue; } }); }; const result = sumTwoObjects(obj1, obj2); // 输出结果: { a: 15, b: 35, c: 30, d: 25 }
这个方法还支持嵌套对象的递归求和,比如嵌套属性是数字的话也会自动相加,非常省心。
2. 单个对象数组按键求和
如果是一组对象,想要把所有对象中相同key的数值累加起来,可以用_.reduce配合上面的合并逻辑:
const objArray = [ { a: 1, b: 2 }, { a: 3, b: 4, c: 5 }, { a: 5, c: 10 } ]; const sumObjectArray = (arr) => { return _.reduce(arr, (accumulator, currentObj) => { return _.mergeWith(accumulator, currentObj, (prev, curr) => { // 处理其中一个对象没有该key的情况,直接取存在的数值 return _.isNumber(prev) && _.isNumber(curr) ? prev + curr : curr ?? prev; }); }, {}); // 初始累加器是一个空对象 }; const arrayResult = sumObjectArray(objArray); // 输出结果: { a: 9, b: 6, c: 15 }
3. 两个对象数组对应位置对象求和
要是你需要把两个数组中对应位置的对象按键求和(比如数组1的第1个对象和数组2的第1个对象相加),可以用_.zipWith结合之前的sumTwoObjects函数:
const arr1 = [{ a: 2, b: 3 }, { x: 10 }]; const arr2 = [{ a: 5, b: 7 }, { x: 20, y: 5 }]; const sumCorrespondingObjects = (arrA, arrB) => { return _.zipWith(arrA, arrB, sumTwoObjects); }; const zipResult = sumCorrespondingObjects(arr1, arr2); // 输出结果: [{ a:7, b:10 }, { x:30, y:5 }]
这些方法都是Lodash原生函数的组合,不需要额外写复杂的循环,简洁又可靠。
内容的提问来源于stack exchange,提问作者Allen Wang
相关产品推荐
相关产品推荐

