Javascript中如何通过公共ID字段关联合并两个JSON数组
最优实现方案
性能最优的方案不是循环加filter,而是先将JSON B转换为company_id为键的哈希映射(JS中可直接用Map或普通对象),再遍历JSON A完成匹配,整体时间复杂度为O(n + m)(n为JSON A长度,m为JSON B长度),远优于循环加filter的O(n*m)复杂度。
方案原理
- 一次性遍历JSON B生成映射表,仅需O(m)时间
- 遍历JSON A时,直接通过键值查找获取公司名,单次查找时间为O(1),总遍历时间为O(n)
- 即使JSON A存在大量相同
company_id的元素,也无需重复查找JSON B,匹配效率不会下降
代码实现(适配现代JS/Vue环境)
// 第一步:生成公司ID到名称的映射 const companyMap = new Map(jsonB.map(item => [item.company_id, item.name])) // 第二步:合并生成JSON C,可添加兜底值处理未匹配到公司的场景 const jsonC = jsonA.map(order => ({ ...order, company_name: companyMap.get(order.company_id) ?? '未知公司' }))
为什么不推荐循环加filter?
循环加filter的写法每处理一条JSON A的记录,都需要遍历一次完整的JSON B数组,当两个数组长度都达到千级以上时,运算量会暴涨到百万级,性能会出现明显下降,仅适合数据量极小的临时场景。
内容的提问来源于stack exchange,提问作者Andrea Bruno Brunato
相关产品推荐
相关产品推荐

