按子数组值过滤对象数组

8

我想要实现的是:

movies = [{'title': 'a', 'genres': ['Romance', 'Comedy']}, 
          {'title': 'b', 'genres': ['Drama', 'Comedy']}, 
          {'title': 'c', 'genres': ['Action', 'Adventure']}]

filters = ['Romance', 'Drama']

筛选后数组的期望内容:

[{'title': 'a', 'genres': ['Romance', 'Comedy']}, 
 {'title': 'b', 'genres': ['Drama', 'Comedy']}]

问题在于我不确定如何根据另一个值数组来过滤一个数组。如果“filters”只是一个字符串,那么我可以这样做:
movies.filter(x => x.genres.includes(filters))

但是,如果filters是一个值数组,这显然行不通。
非常感谢任何帮助。

你需要在过滤函数中使用 array.some() 来测试是否有任何类型匹配。 - Barmar
1个回答

13

你很接近了。看起来你需要的是数组 .some 方法。该方法将返回 true,如果它的回调函数对任何项返回 true,因此你需要的是让 "some" 类型包含在筛选列表中:

movies = [{
    'title': 'a',
    'genres': ['Romance', 'Comedy']
  },
  {
    'title': 'b',
    'genres': ['Drama', 'Comedy']
  },
  {
    'title': 'c',
    'genres': ['Action', 'Adventure']
  }
]

filters = ['Romance', 'Drama']

//[{'title': 'a', 'genres': ['Romance', 'Comedy']}, 
// {'title': 'b', 'genres': ['Drama', 'Comedy']}]

console.log(movies.filter(x => x.genres.some(g => filters.includes(g))))


1
谢谢!事实上我最初的问题描述有误,我想要筛选出tags中每个项与电影流派相交的项目,但是你的回答让我朝正确的方向前进了。以下是我得出的结果,希望对其他人有所帮助:movies.filter(x => tags.every(y => x.genres.includes(y))) - yobogoya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接