Lodash中如何实现嵌套对象数组的累加合并?
核心实现逻辑
不需要硬编码判断具体有哪些年份,只需要按层级匹配相同的键路径,对同路径下的数值字段做累加,就能兼容任意数量的年份、任意长度的输入数组。
关键注意点:输入的a、b字段是字符串格式的数字,累加前必须转换为数值类型,否则会触发字符串拼接逻辑,出现
"100"+"300"="100300"的异常结果。
原生JS 实现
零依赖、逻辑透明,可直接拷贝到项目中使用:
// 示例输入 const inputArr = [ { 2017: { a: "100", b: "200" }, 2018: { a: "101", b: "202" } }, { 2017: { a: "300", b: "400" }, 2018: { a: "303", b: "404" } } ] function mergeObjectArr(arr) { const mergedResult = {}; arr.forEach(item => { // 遍历当前对象所有的年份键,动态适配任意新增年份 Object.keys(item).forEach(yearKey => { const yearData = item[yearKey]; // 初始化对应年份的累加容器 if (!mergedResult[yearKey]) { mergedResult[yearKey] = { a: 0, b: 0 }; } // 字符串转数值后累加 mergedResult[yearKey].a += Number(yearData.a); mergedResult[yearKey].b += Number(yearData.b); }) }) // 封装为要求的数组结构 return [mergedResult]; } // 调用后即可得到符合预期的合并结果 const merged = mergeObjectArr(inputArr);
这段实现没有硬编码年份判断,后续如果输入里新增2019、2020等任意年份的数据,不需要修改函数逻辑就能自动适配累加。
Lodash 实现
如果项目已经引入了lodash,可以借助内置的递归合并能力减少手写遍历代码的量:
import _ from 'lodash'; function mergeObjectArrWithLodash(arr) { // 自定义合并规则:对所有同路径下可转为数字的字段做累加 const mergeCustomizer = (objValue, srcValue) => { if (!isNaN(Number(srcValue))) { return (Number(objValue) || 0) + Number(srcValue); } } // 将数组中所有对象合并到同一个空对象上,传入自定义累加规则 const merged = _.mergeWith({}, ...arr, mergeCustomizer); return [merged]; }
这种写法不需要手动写嵌套遍历逻辑,如果后续对象的嵌套层级加深(比如年份对象下新增多层属性),只需要调整自定义的累加规则即可,扩展性更强。
选型建议
- 项目没有引入lodash的场景,优先选择原生实现,无额外依赖、逻辑简单易排查
- 已经在项目中使用lodash的场景,第二种写法适配复杂嵌套结构的成本更低
内容的提问来源于stack exchange,提问作者Miss.Q
相关产品推荐
相关产品推荐

