如何按层级合并4个项目相关数组(主项目→子项目→里程碑→活动)
实现完整层级合并的方案
核心思路
既然已经完成主项目与子项目的合并,接下来只需要先把活动关联到对应里程碑,再把里程碑关联到对应子项目,利用Map做分组映射可以大幅提升匹配效率,避免嵌套循环带来的性能问题。
具体实现步骤&代码
假设你已合并好的数组叫mergedMainSubProjects(结构参考:[{ ProjectID: xxx, subProjects: [{ SubProjectID: xxx, ... }, ...] }, ...]),按以下步骤执行:
- 给活动按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); });
- 给里程碑关联活动并按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); });
- 把里程碑关联到对应子项目
遍历已合并的主项目-子项目数组,给每个子项目添加对应的里程碑列表:
// 生成最终完整层级数组 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
相关产品推荐
相关产品推荐

