如何检测对象数组中的SPOUSE值并提取编号,兼容IE9,排查spouseIndex未定义问题
现有代码存在的问题
- 对
forEach的返回机制存在核心误解:Array.prototype.forEach执行后永远返回undefined,哪怕回调函数里写了return语句,返回值也只会被forEach内部丢弃,完全无法传递到外层上下文。之前代码写的var spouseExist = array1.forEach(...)赋值语句,拿到的永远是undefined,根本存不住匹配结果。 - 大量使用IE9完全不兼容的ES6语法:包括
const变量声明、箭头函数,这类语法在IE9的JS引擎中会直接触发语法错误,导致代码完全无法执行。 - 核心逻辑缺失:全程没有定义需求要求的
spouseExits、spouseIndex目标变量,也没有写匹配成功后给这两个变量赋值的逻辑,相当于循环空转,自然导致spouseIndex始终为undefined。 - 冗余的流程设计:用
Object.keys+reduce的组合虽然部分方法在IE9有基础实现,但整个流程没有设计状态传递逻辑,reduce最终返回的空对象没有承载任何检测结果,完全达不到需求目标。
兼容IE9的正确实现方案
实现逻辑完全基于IE9原生支持的基础语法编写,不依赖任何ES6特性、不需要引入polyfill,具体代码如下:
// 初始化需求要求的目标变量 var spouseExits = false; var spouseIndex = null; // 遍历eligibilityMap的所有可枚举属性 for (var key in eligibilityMap) { // 跳过原型链继承的非自身属性,避免遍历异常 if (!eligibilityMap.hasOwnProperty(key)) { continue; } var currentValueArray = eligibilityMap[key]; // 用基础for循环遍历数组元素,兼容性适配所有IE版本 for (var arrIndex = 0; arrIndex < currentValueArray.length; arrIndex++) { var element = currentValueArray[arrIndex]; // 检查元素是否以"SPOUSE"为前缀 if (element.indexOf('SPOUSE') === 0) { spouseExits = true; // 截取"SPOUSE"后的数字部分,转为数值类型存入spouseIndex // "SPOUSE"字符串长度为6,从索引6开始截取后续字符 var postStr = element.slice(6); spouseIndex = Number(postStr); // 匹配成功后直接跳出数组遍历,减少冗余计算 break; } } // 已经匹配到目标元素的话直接跳出对象遍历 if (spouseExits) { break; } }
适配说明:
- 所有变量使用
var声明,不使用ES6的const/let、箭头函数等IE9不支持的语法- 遍历逻辑采用最基础的
for...in+普通for循环,不依赖Object.keys、reduce、forEach等存在兼容边界的ES5方法,确保在IE9环境下可以稳定运行- 匹配逻辑严格按需求实现:确认元素以
SPOUSE为前缀后,直接设置存在标志位、提取后缀的数字部分存入spouseIndex,匹配成功后主动终止遍历,提升执行效率
内容的提问来源于stack exchange,提问作者dragonfly
相关产品推荐
相关产品推荐

