访问malzeme.aciklama触发TypeError,已定义对象仍返回undefined
解决TypeError: Cannot read properties of undefined (reading 'aciklama')问题
错误根源分析
你的报错出现在这行代码:
let malzeme_id = dataLogo[dataLogo.indexOf(dataLogo.find(item => item.malzeme_id === element.id))].aciklama;
核心问题有两个:
- 当
dataLogo.find(item => item.malzeme_id === element.id)找不到匹配项时,会返回undefined,此时dataLogo.indexOf(undefined)返回-1,dataLogo[-1]为undefined,再访问.aciklama必然抛出TypeError。 - 目标对象中
malzeme是包含aciklama属性的对象,但你的代码把newObj.malzeme赋值成了字符串类型的aciklama值,后续尝试访问malzeme.aciklama时,字符串没有该属性,自然返回undefined。
修复方案
1. 安全处理匹配结果,避免链式调用失败
拆分步骤,先获取匹配项并判断是否存在,再进行属性访问:
dataWeb.forEach(element => { let newObj = { id: '', malzeme: {}, // 改为对象类型,匹配目标结构 stok_kodu: '', aciklama: '', fiyat: '', }; newObj.stok_kodu = element.stok_kodu; newObj.id = element.id; // 先获取匹配的物料项 const matchedMalzeme = dataLogo.find(item => item.malzeme_id === element.id); if (matchedMalzeme) { // 赋值完整的malzeme对象,或按需提取属性 newObj.malzeme = { aciklama: matchedMalzeme.aciklama, // 可根据需求补充其他属性如fiyat、stok_kodu等 }; } else { // 找不到匹配项时设置默认值,避免后续报错 newObj.malzeme = { aciklama: '无匹配物料信息' }; } newArray.push(newObj); });
2. 对齐目标对象结构
确保newObj.malzeme是对象类型,而非字符串。这样后续访问newObj.malzeme.aciklama时,就能正确读取到属性值。
额外提示
- 避免嵌套过深的链式调用,拆分步骤能让代码更易读,也便于排查错误。
- 注意异步数据加载顺序:你的报错包含
async controlDisplay,要确保dataLogo和dataWeb都已完成加载后再执行循环逻辑。
内容的提问来源于stack exchange,提问作者Can Yetgin
相关产品推荐
相关产品推荐

