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

JavaScript使用reduce将activatedItems、quarterItems属性合并到modules

可以用reduce实现该需求,你的原有代码问题在于将匹配到的三个对象单独插入数组,而非将属性合并到同一个module对象中,同时三层嵌套循环的查询效率也较低,我们可以先将关联数据转为映射表提升查询效率,再完成属性合并。

实现代码

// 原数据对象
const originData = {
  "isExternalVisitor": false,
  "modules": [
    {
      "moduleId": "e569da0e-44e6-4f75-96c4-bdd888678abd",
      "code": "NEWQ2/SITENAME/2021-Q3-1",
      "siteId": "10babdbe-5346-43e8-932a-4c7ae54dcb1b",
      "activatedId": "2e03c658-3bbd-4332-bb1b-14fe56c7e753"
    },
    {
      "moduleId": "588905b4-2c1d-49bf-a71f-84210405bc94",
      "code": "NEWQ1/SITENAME/2021-Q1-2",
      "siteId": "10babdbe-5346-43e8-932a-4c7ae54dcb1b",
      "activatedId": "6c1691d2-7c37-4888-a446-9219fa9b9014"
    }
  ],
  "activatedItems": [
    {
      "activatedId": "2e03c658-3bbd-4332-bb1b-14fe56c7e753",
      "stQuarterId": "b36d7e23-15e5-4f97-b52e-65757de4b264"
    },
    {
      "activatedId": "6c1691d2-7c37-4888-a446-9219fa9b9014",
      "stQuarterId": "01000f98-6470-440a-a833-95b199ab1f7a"
    }
  ],
  "quarterItems": [
    {
      "id": "b36d7e23-15e5-4f97-b52e-65757de4b264",
      "checklistId": "8b479656-8cde-4bff-9c51-d5eca369bc76",
      "fullName": "dsad",
      "year": "2021-01-01T00:00:00",
      "quarter": "2021-Q3",
      "versions": 1
    },
    {
      "id": "01000f98-6470-440a-a833-95b199ab1f7a",
      "checklistId": "039f2584-1ca5-4ee3-b46f-cdf1887af7f6",
      "fullName": "NEWQ1",
      "year": "2021-01-01T00:00:00",
      "quarter": "2021-Q1",
      "versions": 2
    }
  ]
};

// 1. 用reduce生成activated映射表,key为activatedId
const activatedMap = originData.activatedItems.reduce((map, item) => {
  map[item.activatedId] = item;
  return map;
}, {});

// 2. 用reduce生成quarter映射表,key为quarter的id
const quarterMap = originData.quarterItems.reduce((map, item) => {
  map[item.id] = item;
  return map;
}, {});

// 3. 合并属性生成最终对象
const result = {
  isExternalVisitor: originData.isExternalVisitor,
  modules: originData.modules.map(module => {
    const matchedActivated = activatedMap[module.activatedId] || {};
    const matchedQuarter = quarterMap[matchedActivated.stQuarterId] || {};
    // 合并三个对象的属性,后面对象的同名字段会覆盖前面的,可根据需要调整合并顺序
    return {...module, ...matchedActivated, ...matchedQuarter};
  })
};

console.log(result);

代码说明

  • 先通过reduce把两个关联数组转为键值对映射表,避免嵌套循环查询,时间复杂度从O(n^3)降到O(n)
  • 遍历modules数组时直接从映射表取对应关联数据,用扩展运算符合并属性,最终输出的结构和要求的完全一致
  • 加了空值兜底逻辑,就算出现没有匹配到关联数据的情况也不会报错

内容的提问来源于stack exchange,提问作者Honey Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:06:04