JavaScript:同类型对象数组哈希访问及RECOGNIZERS遍历报错求助
解决遍历RECOGNIZERS数组时RegExpRecognizer报错的问题
我明白你现在碰到的麻烦了——遍历RECOGNIZERS数组收集LuisRecognizer模型时,一遇到RegExpRecognizer就报错,哪怕加了判断逻辑也没搞定对吧?其实问题大概率出在你的条件判断没准确过滤掉非LuisRecognizer对象,或者访问models['*']时没做安全校验。下面给你几个可行的解决方案:
方案1:用类型判断精准过滤
如果你的代码环境里能直接访问LuisRecognizer类,可以用instanceof来精准识别目标对象,避免碰到底层结构不同的RegExpRecognizer:
const targetModels = []; for (const recognizer of RECOGNIZERS) { // 只处理LuisRecognizer实例 if (recognizer instanceof LuisRecognizer) { const model = recognizer.models['*']; if (model) { targetModels.push(model); } } }
方案2:检查特征属性做安全访问
如果没法直接用instanceof(比如不同模块导出的类型),可以通过检查models属性是否存在且为对象来过滤:
const targetModels = []; for (const recognizer of RECOGNIZERS) { // 先确认models属性存在且是可访问的对象 if (recognizer.models && typeof recognizer.models === 'object') { try { const model = recognizer.models['*']; if (model) { targetModels.push(model); } } catch (err) { // 捕获意外错误,避免中断遍历 console.warn(`跳过非LUIS识别器: ${err.message}`); } } }
方案3:用可选链简化安全访问
如果你的项目支持ES2020+语法,可选链操作符?.能让代码更简洁,自动处理属性不存在的情况:
const targetModels = []; for (const recognizer of RECOGNIZERS) { // 用?.安全访问models['*'],不存在则返回undefined const model = recognizer.models?.['*']; if (model) { targetModels.push(model); } }
为什么之前的判断失效?
你之前加的条件可能只是简单判断了对象是否存在,但RegExpRecognizer本身是一个合法对象,只是没有models属性——当你直接访问RECOGNIZERS[i].models['*']时,会因为models是undefined而抛出“Cannot read properties of undefined”的错误。上面的方案都是先确保models属性可访问,再去获取目标模型,从根源避免报错。
内容的提问来源于stack exchange,提问作者Sam Lim
相关产品推荐
相关产品推荐

