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

通过Project作为key映射关联两个JSON对象数据的最优实现方式是什么

原有实现合理性评估

你当前的写法逻辑上是可以跑通的,但存在两点问题:

  1. 效率短板:如果getMilestones和getArtefacts内部是每次遍历整个详情数据集筛选对应项目数据,整体时间复杂度是O(n*(m+k))(n为项目总数,m为里程碑总数,k为交付物总数),数据量较大时会有明显的性能损耗。
  2. 字段匹配风险:你代码中用到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:04