You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤对象数组,使对象内部数组包含另一个数组的所有元素

实现对象数组嵌套包含过滤的方案

核心实现代码

你需要的「嵌套数组必须完全包含过滤数组所有元素」的校验逻辑,直接用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属性,会导致判断永远不成立

如果数据量较大,可以把数组转成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:36:00