JS数组嵌套filter查询无结果:sense、gloss字段支持单值或数组类型
问题排查与修复方案
原代码核心问题
- 变量作用域错误:
result变量在if分支内部声明,外层无法访问,导致filter判断条件始终不成立 - 层级访问错误:判断gloss时错误访问了
x.sense['gloss'],sense是数组,应该访问当前遍历的sense_item下的gloss字段 - 逻辑方法使用不当:应该用
some()方法判断是否存在匹配项(只要有一个匹配就返回真),而不是filter(),filter返回的数组即使为空也是真值,会导致逻辑误判 - 边界情况遗漏:没有处理
sense为单个对象、gloss为单个字符串的场景 - 匹配逻辑不一致:gloss的判断用了严格相等
===,和k_ele的includes()包含匹配逻辑不符,会导致部分匹配无法命中
修复后可运行代码
export const mainSearch = async (req, res) => { const searchKey = req.params.id const filterData2 = teste.entry.filter(x => { // 不存在sense字段直接跳过 if (!('sense' in x)) return false // 统一将sense转为数组,兼容单个对象/数组两种格式 const senseList = [].concat(x.sense) // 判断是否存在任意sense的gloss包含搜索关键词 return senseList.some(sense_item => { // 统一将gloss转为数组,兼容单个字符串/数组两种格式 const glossList = [].concat(sense_item.gloss) return glossList.some(gloss => gloss.includes(searchKey)) }) }) if (filterData2.length > 0) { console.log(filterData2) // res.json(filterData2) } else { // 无匹配结果的处理逻辑 // res.json([]) } }
代码逻辑说明
- 用
[].concat(xxx)的写法统一将可能为单值/数组的字段转为数组,避免大量重复的分支判断代码 - 两层
some()方法只要找到任意一个匹配项就会提前返回,性能更高,符合「只要有一个gloss匹配就保留条目」的需求 - 统一用
includes()做包含匹配,和你之前k_ele的过滤逻辑保持一致,如果需要严格全匹配可以替换为===
内容的提问来源于stack exchange,提问作者Steffano Festa
相关产品推荐
相关产品推荐

