JS遍历JSON数组时报Uncaught TypeError读取undefined属性'1'求解
问题根因定位
报错的核心原因是遍历数组时硬编码了最大索引值,具体问题点如下:
- 你写的循环逻辑是
for (i = 0; i < 63274; i++),但JSON.parse解析得到的arrBirds数组实际长度不一定恰好是63274,当索引i超过数组实际长度时,arrBirds[i]就会返回undefined,此时访问undefined[1]就会触发你遇到的类型错误。 - 额外问题:循环变量
i没有用let/var声明,属于隐式全局变量,可能被页面其他脚本修改,也会导致索引异常。 - 逻辑优化点:找到匹配项后没有终止循环,会继续执行不必要的遍历;同时你把错误提示放在
else分支中,只要某一项不匹配就会覆盖错误提示内容,逻辑不合理。
修复方案
1. 调整循环逻辑
把硬编码的最大索引替换为数组实际长度,找到匹配项后加break终止循环,错误提示移到循环结束后统一判断展示。
2. 修复变量声明
给循环变量i加let声明,避免全局变量污染。
修复后的核心代码示例:
// 原有arrBirds = JSON.parse(jsonData); 逻辑保持不变 let hasMatch = false; // 用数组实际长度遍历,不会出现索引越界 for (let i = 0; i < arrBirds.length; i++) { // 可选防御判断:跳过空的数组项,进一步避免报错 if (!arrBirds[i] || arrBirds[i].length < 24) continue; if (arrBirds[i][1] === userAdultInt && arrBirds[i][2] === userInfantInt && arrBirds[i][3] === userPreschoolInt && arrBirds[i][4] === userSchoolageInt && arrBirds[i][5] === userTeenageInt && arrBirds[i][9] === userCounty) { // 原有匹配成功后的赋值、显隐逻辑保持不变 // ...... hasMatch = true; // 找到匹配项直接终止循环,减少不必要的性能消耗 break; } } // 循环结束后统一判断是否匹配到结果 if (!hasMatch) { document.getElementById('error').innerHTML = "我们目前没有该家庭类型的相关信息,非常抱歉。"; }
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

