通过Project作为key映射关联两个JSON对象数据的最优实现方式是什么
原有实现合理性评估
你当前的写法逻辑上是可以跑通的,但存在两点问题:
- 效率短板:如果
getMilestones和getArtefacts内部是每次遍历整个详情数据集筛选对应项目数据,整体时间复杂度是O(n*(m+k))(n为项目总数,m为里程碑总数,k为交付物总数),数据量较大时会有明显的性能损耗。 - 字段匹配风险:你代码中用到的
element.ProjectCode和你给出的示例JSON中的项目编号字段名Project不一致,需要注意字段对齐。
更高效简洁的实现方案
推荐先把详情数据集预转为按项目编号分组的哈希索引,后续匹配的时间复杂度直接降到O(1),整体复杂度只有O(n+m+k),性能提升非常明显:
第一步:构建分组索引(仅执行1次)
// 从详情接口拿到数据后先分组 const { Milestones, Artefacts } = 详情接口返回的数据集; // 里程碑按项目编号分组 const milestoneGroup = Milestones.reduce((map, item) => { map[item.Project] = map[item.Project] || []; map[item.Project].push(item); return map; }, {}); // 交付物按项目编号分组 const artefactGroup = Artefacts.reduce((map, item) => { map[item.Project] = map[item.Project] || []; map[item.Project].push(item); return map; }, {});
第二步:合并数据
如果需要修改原Summary数组,直接用forEach即可:
this.clSummary.forEach(project => { project.Milestone = milestoneGroup[project.Project] || []; project.Artefacts = artefactGroup[project.Project] || []; });
如果不想修改原数组,希望生成新的合并后数组,可以用类LINQ的map方法:
const mergedSummary = this.clSummary.map(project => ({ ...project, Milestone: milestoneGroup[project.Project] || [], Artefacts: artefactGroup[project.Project] || [] }));
可选:用工具库简化代码
如果项目允许引入lodash这类工具库,分组逻辑可以进一步简化:
const milestoneGroup = _.groupBy(Milestones, 'Project'); const artefactGroup = _.groupBy(Artefacts, 'Project');
后续匹配逻辑和上面完全一致。
内容的提问来源于stack exchange,提问作者Sandeep Thomas
相关产品推荐
相关产品推荐

