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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:00:29