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
相关产品推荐
相关产品推荐

