вложение нескольких методов фильтрации javascript - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь выполнить вызов, и я застрял: у меня есть один большой массив фильмы , который имеет внутри имя-жанра , который является другим массивом. Я хочу отфильтровать это фильмов , проверив его genreName по выбранным жанрам из флажков, сохраненных в массиве selectedGenres Мои трудности возникают здесь, когда мне приходится проверять каждый genreName массив против всех элементов в selectedGenres . Задача состоит в том, чтобы в selectedGenres было несколько жанров, чтобы показывать только фильмов , которые имеют всех этих выбранных жанров, а не только один из них.

код:

const movies = [ 
{title:"movie 1",genreName:["Action", "Drama"]},
{title:"movie 2",genreName:["Action", "Fantasy", "Adventure"]},
{title:"movie 3",genreName:["Action", "Fantasy", "Science Fiction"]},
{title:"movie 4",genreName:["Action", "Drama", "Thriller"]}
]
const selectedGenres = ["Action","Drama"];  //based on this selection, only movie1 and movie4 should be in the filteredMovies variable.

const filteredMovies = movies.filter(movie => { //loop through each movie
        movie.genreName.filter(genre => { // loop through each item in genreName array
          return selectedGenres.forEach(name => { // loop through each item in selectedGenres array
            return name.indexOf(genre) > -1;
          });
        });
      });

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Используйте filter для фильмов и возвращайте true для фильмов, которые имеют every выбранный жанр.

const movies = [ 
{title:"movie 1",genreName:["Action", "Drama"]},
{title:"movie 2",genreName:["Action", "Fantasy", "Adventure"]},
{title:"movie 3",genreName:["Action", "Fantasy", "Science Fiction"]},
{title:"movie 4",genreName:["Action", "Drama", "Thriller"]}
]
const selectedGenres = ["Action","Drama"];  //based on this selection, only movie1 and movie4 should be in the filteredMovies variable.


const filteredMovies = movies.filter(movie => selectedGenres.every(filter => movie.genreName.includes(filter)))

console.log(filteredMovies);
0 голосов
/ 21 марта 2020

Вы ищете every

const movies = [
    {title:"movie 1",genreName:["Action", "Drama"]},
    {title:"movie 2",genreName:["Action", "Fantasy", "Adventure"]},
    {title:"movie 3",genreName:["Action", "Fantasy", "Science Fiction"]},
    {title:"movie 4",genreName:["Action", "Drama", "Thriller"]}
];

const filter = ['Action', 'Drama'];

const result = movies.filter(m => filter.length === m.genreName.length && m.genreName.every(g => filter.includes(g)));
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...