JavaScript如何将activatedItems、quarterItems属性合并到modules数组对象
解决方案
你原有方案的问题在于按下标索引合并仅适用于三个数组元素顺序严格一一对应的场景,但quarterItems是公共维度数据,和modules/activatedItems长度、顺序都不匹配,必须按关联字段做映射匹配才能得到正确结果。
实现思路
- 先将
activatedItems转为以activatedId为键的映射表,快速匹配module对应的激活配置 - 再将
quarterItems转为以id为键的映射表,快速匹配激活配置对应的季度信息 - 遍历
modules数组时按关联字段查表合并属性,完全规避下标匹配的错位问题
完整代码
// 提取原始数据 const { isExternalVisitor, isAdmin, modules, activatedItems, quarterItems } = response.result; // 生成activated映射表:key为activatedId,value为对应激活项 const activatedMap = new Map(activatedItems.map(item => [item.activatedId, item])); // 生成quarter映射表:key为季度id,value为对应季度项 const quarterMap = new Map(quarterItems.map(item => [item.id, item])); // 组装最终结果 const result = { isExternalVisitor, isAdmin, modules: modules.map(module => { const matchedActivated = activatedMap.get(module.activatedId) || {}; const matchedQuarter = quarterMap.get(matchedActivated.stQuarterId) || {}; // 合并属性,优先级:module < activatedItem < quarterItem,重名属性后者覆盖前者 return { ...module, ...matchedActivated, ...matchedQuarter }; }) };
补充说明
- 用Map做映射的整体时间复杂度为O(n+m),远优于每次遍历数组查找的O(n*(m+k)),数据量越大效率优势越明显
- 代码中添加了
|| {}降级逻辑,可避免关联字段不存在时报错 - 属性合并顺序和你预期输出的属性优先级完全一致
内容的提问来源于stack exchange,提问作者Honey Singh
相关产品推荐
相关产品推荐

