调用toLowerCase()时出现undefined属性读取错误排查求助
解决“Cannot read properties of undefined (reading 'toLowerCase')”错误及零宽空格问题
问题核心分析
虽然控制台打印了正常的item.leader值,但报错说明遍历过程中存在某个item对象的leader属性为undefined——日志只输出了前几个正常的条目,报错的是后续某个未被打印到的item。另外你怀疑的零宽空格问题,也可能导致字符串看起来正常但实际包含不可见字符,干扰匹配逻辑。
解决方案
1. 先做防御性判断,避免undefined报错
在调用toLowerCase()前,先检查属性是否存在,同时优化重复转换的性能:
const progress = JSON.parse(fs.readFileSync(`./database/sv/progress.json`)); function match(selector) { let matched = null; // 提前处理selector,避免重复转小写 const lowerSelector = typeof selector === 'string' ? selector.toLowerCase() : selector; progress.progress.forEach(item => { if (Number.isInteger(Number(selector))) { if (item.id == selector) { matched = item; return; // 找到匹配直接跳出循环 } } else { // 先检查item.leader是否存在再处理 if (item.leader) { console.log(item.leader, item.leader.toLowerCase()); if (item.leader.toLowerCase().includes(lowerSelector)) { matched = item; return; } } // 同样检查item.name if (item.name && item.name.toLowerCase().includes(lowerSelector)) { matched = item; return; } } }); return matched; }
2. 处理零宽空格及不可见字符
如果确实存在零宽空格(如\u200B、\uFEFF)这类不可见字符,可新增工具函数清除后再处理:
// 清除字符串中的零宽空格、BOM等不可见字符 function cleanString(str) { if (typeof str !== 'string') return str; return str.replace(/[\u200B\uFEFF\u200C\u200D]/g, '').trim(); } // 修改match函数中的处理逻辑 function match(selector) { let matched = null; const lowerSelector = typeof selector === 'string' ? cleanString(selector).toLowerCase() : selector; progress.progress.forEach(item => { if (Number.isInteger(Number(selector))) { if (item.id == selector) { matched = item; return; } } else { if (item.leader) { const cleanedLeader = cleanString(item.leader).toLowerCase(); console.log(item.leader, cleanedLeader); if (cleanedLeader.includes(lowerSelector)) { matched = item; return; } } if (item.name) { const cleanedName = cleanString(item.name).toLowerCase(); if (cleanedName.includes(lowerSelector)) { matched = item; return; } } } }); return matched; }
3. 定位JSON数据中的异常项
报错的根源可能是progress.json里存在缺失leader属性的条目,可先排查数据:
// 遍历打印所有leader为undefined的item progress.progress.forEach((item, index) => { if (!item.leader) { console.log(`第${index}个条目缺失leader属性:`, item); } });
找到异常条目后直接修正JSON文件即可。
内容的提问来源于stack exchange,提问作者Nicolas Pezzullo
相关产品推荐
相关产品推荐

