多标签搜索过滤失效求助:使用includes()匹配无结果
问题分析与解决
嘿,我一眼就瞅出问题所在啦!你当前的过滤逻辑写反了,而且用法也不对,导致完全匹配不到结果。
错误原因
你写的代码里:
result = array.filter(item => item.tag.some(t => t.includes(tags)))
这里的t是店铺标签里的单个字符串(比如"Coffee"),而tags是一个数组['Coffee', 'Cookies']。字符串的includes()方法只能接受字符串作为参数,你传一个数组进去的话,它会把数组转换成字符串(变成"Coffee,Cookies"),然后检查单个标签里是否包含这个字符串——显然你的店铺标签里没有这样的内容,所以整个条件永远返回false,自然就没有结果了。
正确实现(匹配所有传入标签)
你的需求是同时传入两个标签时,返回同时拥有这两个标签的店铺,这时候应该用tags.every()来确保每一个传入的标签都存在于当前店铺的标签数组中:
let array = [ { "name": "CoffeShop", "tag":[ "Coffee", "Cookies" ] }, { "name": "TeaShop", "tag":[ "Tea" ] }, { "name": "IceCreamShop", "tag": [ "Ice Cream" ] }, ] let tags = ['Coffee', 'Cookies'] // 筛选出包含所有传入标签的店铺 const result = array.filter(item => tags.every(tag => item.tag.includes(tag))) console.log(result) // 输出:[{ "name": "CoffeShop", "tag":[ "Coffee", "Cookies" ] }]
额外补充(匹配任意一个传入标签)
如果之后你需要实现“传入多个标签,只要店铺有其中一个就返回”的逻辑,可以用tags.some():
const result = array.filter(item => tags.some(tag => item.tag.includes(tag))) // 这样传入['Coffee', 'Tea']会返回CoffeShop和TeaShop
内容的提问来源于stack exchange,提问作者MohmedBm
相关产品推荐
相关产品推荐

