如何对OCR返回的JSON结果按前缀字符串实现模糊过滤?
解决OCR JSON结果中类似SQL LIKE的过滤问题
你遇到的问题核心是部分数据条目没有Text属性,导致调用includes或match时触发了Cannot read property 'includes' of undefined错误。
错误原因分析
之前的精确匹配d.Text == 'SALES'能正常工作,是因为只有带有Text: 'SALES'的条目会被匹配上,那些没有Text属性的条目会直接被过滤掉(undefined == 'SALES'结果为false)。但当你使用includes时,代码会遍历数组里的每一个条目,包括那些没有Text属性的条目,这时候尝试调用undefined.includes()就会抛出错误。
解决方案
在进行字符串匹配前,先确保Text属性存在且是字符串类型,再执行包含判断。这里有几种可靠的写法:
1. 基础兼容写法(适配所有环境)
var cashierData = data.filter(d => typeof d.Text === 'string' && d.Text.includes('CASH'));
这种写法先检查d.Text是否为字符串类型,避免了undefined或其他类型的干扰,再用includes判断是否包含目标前缀。
2. 简洁可选链写法(ES2020+ 环境可用)
如果你的运行环境支持ES2020及以上,可以用更简洁的可选链语法:
var cashierData = data.filter(d => d.Text?.includes('CASH'));
?.操作符会在d.Text为undefined或null时直接返回undefined,不会继续执行后面的includes,自然也就不会报错。
3. 旧环境替代写法
如果你的环境连includes都不支持(比如老旧浏览器),可以用indexOf替代:
var cashierData = data.filter(d => typeof d.Text === 'string' && d.Text.indexOf('CASH') !== -1);
效果验证
用上述代码过滤你提供的OCR数据片段,就能正确匹配到Text: 'CASHIER: JSMITH'的条目,实现类似SQL中LIKE '%CASH%'的效果。
内容的提问来源于stack exchange,提问作者Craigmax
相关产品推荐
相关产品推荐

