Javascript获取数组索引键 实现两个州代码关联数组的合并
问题分析
你的现有代码存在三个核心问题:
- 默认两个数组相同索引位置对应同一个州,这一假设不成立,两个数组的州排序大概率不一致
- 直接对两个子数组做全等比较,数组为引用类型,只要不是同一个内存引用永远返回
false,你需要对比的是子数组索引为0的州代码字段 - 仅做了匹配项打印,没有实现替换逻辑
实现方案
推荐优先使用Map做查找映射,时间复杂度为O(n+m),效率远高于嵌套循环的O(n*m):
// 版本1:不修改原数组,返回新的合并后数组 function mergeArrays(arr1, arr2) { // 将第二个数组转为Map,键为州代码,值为对应数值 const stateMap = new Map(arr2); return arr1.map(([stateCode, defaultValue]) => { // 匹配到第二个数组的数值则替换,否则保留默认值 return [stateCode, stateMap.get(stateCode) ?? defaultValue]; }) }
如果需要直接修改原第一个数组,可以使用下面的版本:
// 版本2:直接修改原arr1,无返回值 function mergeArrays(arr1, arr2) { const stateMap = new Map(arr2); for(let i = 0; i < arr1.length; i++) { const stateCode = arr1[i][0]; if(stateMap.has(stateCode)) { arr1[i][1] = stateMap.get(stateCode); } } }
如果运行环境不支持Map,也可以使用嵌套循环实现:
// 版本3:嵌套循环实现,适合数据量小的场景 function mergeArrays(arr1, arr2) { for(let i = 0; i < arr1.length; i++) { const currentCode = arr1[i][0]; for(let j = 0; j < arr2.length; j++) { if(arr2[j][0] === currentCode) { arr1[i][1] = arr2[j][1]; break; } } } }
内容的提问来源于stack exchange,提问作者Tim Bogdanov
相关产品推荐
相关产品推荐

