如何解决两级链式选择开发时出现forEach读取undefined的报错
报错原因定位
- 数据层级匹配错误:配置数据源的顶层唯一键为
region,所有地区、城镇、酒店的嵌套数据都挂载在该键下,但代码直接从数据源根层级通过选中的地区值取匹配数据,因为根层级不存在对应地区键,最终拿到undefined传入cmo函数,执行forEach方法时触发类型错误。 - 数据结构适配错误:单条地区配置下,所有城镇数据嵌套在
town子对象中,并非地区配置本身是可遍历数组。直接将地区配置对象传给cmo函数时,因为没有对对象做键值提取,后续取城镇名列表、酒店数组的路径全部错位,必然返回undefined。 - 初始化逻辑缺陷:页面加载时,地区下拉框默认选中空值占位项,此时直接调用
setTown()执行取数逻辑,因选中值为空无法匹配到有效配置,同样会向cmo函数传入undefined触发报错,和错误栈中初始化阶段调用setTown触发的异常完全对应。 - 地区列表提取错误:代码中通过
Object.keys(jsonData)提取地区列表,实际只取到了顶层的region键,并非所有地区名称列表。如果要动态渲染地区下拉选项,需要从jsonData.region层级下提取键名才能拿到正确的地区列表。
修复参考代码
// 正确提取地区列表 const regionList = Object.keys(jsonData.region); cmo(regionList, region); function setTown(){ town.innerHTML = ""; hotel.innerHTML = ""; // 空值拦截,避免无效取数 if (!region.value) return; // 正确定位到对应地区的配置对象 const regionConfig = jsonData.region[region.value]; // 从town子对象中提取城镇名列表 const townList = Object.keys(regionConfig.town); cmo(townList, town); setHotel(); }; function setHotel(){ hotel.innerHTML = ""; // 空值拦截,避免无效取数 if (!town.value) return; // 正确定位到选中城镇对应的酒店数组 const hotelList = jsonData.region[region.value].town[town.value]; cmo(hotelList, hotel); };
内容的提问来源于stack exchange,提问作者Kamil Kopera
相关产品推荐
相关产品推荐

