You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:36:01