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

如何按层级合并4个项目相关数组(主项目→子项目→里程碑→活动)

实现完整层级合并的方案

核心思路

既然已经完成主项目与子项目的合并,接下来只需要先把活动关联到对应里程碑,再把里程碑关联到对应子项目,利用Map做分组映射可以大幅提升匹配效率,避免嵌套循环带来的性能问题。

具体实现步骤&代码

假设你已合并好的数组叫mergedMainSubProjects(结构参考:[{ ProjectID: xxx, subProjects: [{ SubProjectID: xxx, ... }, ...] }, ...]),按以下步骤执行:

  1. 给活动按MilestoneID分组
    先把所有活动整理成「里程碑ID → 对应活动数组」的映射,方便后续快速查找:
// 构建活动的MilestoneID映射
const activityMap = new Map();
dataArray4.forEach(activity => {
  const key = activity.MilestoneID;
  if (!activityMap.has(key)) {
    activityMap.set(key, []);
  }
  activityMap.get(key).push(activity);
});
  1. 给里程碑关联活动并按SubProjectID分组
    遍历里程碑数组,给每个里程碑绑定对应的活动列表,再把里程碑按子项目ID分组:
// 构建里程碑的SubProjectID映射,同时关联活动
const milestoneMap = new Map();
dataArray3.forEach(milestone => {
  // 给当前里程碑绑定对应活动,无匹配时设为空数组
  const relatedActivities = activityMap.get(milestone.MilestoneID) || [];
  const milestoneWithActivities = {
    ...milestone,
    activities: relatedActivities
  };

  const key = milestone.SubProjectID;
  if (!milestoneMap.has(key)) {
    milestoneMap.set(key, []);
  }
  milestoneMap.get(key).push(milestoneWithActivities);
});
  1. 把里程碑关联到对应子项目
    遍历已合并的主项目-子项目数组,给每个子项目添加对应的里程碑列表:
// 生成最终完整层级数组
const finalMergedArray = mergedMainSubProjects.map(mainProject => ({
  ...mainProject,
  subProjects: mainProject.subProjects.map(subProject => ({
    ...subProject,
    // 绑定对应里程碑,无匹配时设为空数组
    milestones: milestoneMap.get(subProject.SubProjectID) || []
  }))
}));

关键细节说明

  • 用Map做分组映射,时间复杂度为O(n),比嵌套循环的O(n²)高效得多,数据量越大优势越明显;
  • 每个层级都加了|| []兜底,确保无对应数据时不会出现undefined,保证数组结构一致性;
  • 如果你的已合并数组结构和假设略有差异(比如子项目的字段名不是subProjects),仅需调整对应字段名即可适配。

内容的提问来源于stack exchange,提问作者grabrep gg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:32:12