如何过滤对象数组,使对象内部数组包含另一个数组的所有元素
实现对象数组嵌套包含过滤的方案
核心实现代码
你需要的「嵌套数组必须完全包含过滤数组所有元素」的校验逻辑,直接用Array.every()方法即可实现,该方法会检测数组内所有元素是否都满足指定测试条件,刚好匹配你的需求:
const data = [ {user: 'bob', favoriteThings: ['cats', 'dogs', 'movies']}, {user: 'sally', favoriteThings: ['cats', 'movies', 'trees']}, ] const filterByFavs = ['cats', 'trees'] const result = data.filter(item => { // 校验过滤数组的每一项,都存在于当前对象的favoriteThings中才会保留该对象 return filterByFavs.every(fav => item.favoriteThings.includes(fav)) })
原有代码报错原因
- 第一版filter实现错误:
filter方法返回的是数组,哪怕是空数组在布尔判定中也会被识别为true,相当于所有对象都通过了校验,自然无法得到正确结果。 - 第二版reduce实现错误:
- 同样存在误用filter返回数组作为布尔判断的问题,空数组也会触发
if(allExists)的分支逻辑 - 多余书写了
tag.text属性,你的favoriteThings数组元素都是普通字符串,没有text属性,会导致判断永远不成立
- 同样存在误用filter返回数组作为布尔判断的问题,空数组也会触发
如果数据量较大,可以把数组转成Set优化查询性能,查询时间复杂度会从O(n)降到O(1):
const filterSet = new Set(filterByFavs) const result = data.filter(item => { const itemFavSet = new Set(item.favoriteThings) return [...filterSet].every(fav => itemFavSet.has(fav)) })
内容的提问来源于stack exchange,提问作者securisec
相关产品推荐
相关产品推荐

