You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 10:24:04