различная длина массива в операторе if вне привязанного исключения - PullRequest
0 голосов
/ 21 января 2020

У меня длинное выражение if, где я проверяю различные комбинации возможностей. Вот текущий код, который у меня есть:

for (let i = 0; i < movies.length; i++) {
 if (taste[0] == movies[i].genres[0].name ||
     taste[0] == movies[i].genres[1].name ||
     taste[0] == movies[i].genres[2].name ||
     taste[1] == movies[i].genres[0].name || 
     taste[1] == movies[i].genres[1].name ||
     taste[1] == movies[i].genres[2].name ||
     taste[2] == movies[i].genres[0].name ||
     taste[2] == movies[i].genres[1].name ||
     taste[2] == movies[i].genres[2].name
 ) {
     moviesForUser.push(movies[i].original_title);
   }
}

Моя проблема: Некоторые фильмы имеют разные жанры. Это означает, что в некоторых случаях я сталкиваюсь с недопустимым исключением. Как я могу проверить все возможные варианты комбинации с учетом длины массива?

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Вы можете использовать больше динамических c методов, чтобы избежать таких жестких индексов:

moviesForUser = movies.filter(movie => movie.genres.some(genre => taste.includes(genre.name)))
                      .map(movie => movie.original_title);

Это полностью заменит ваш l oop.

0 голосов
/ 21 января 2020

более читаемая версия:

let moviesForUser = [];

for (let i = 0; i < movies.length; i++) {
    let genreFound = false;
    for (let j = 0; j < movies[i].genres.length; j++) {
        if (taste.includes(movies[i].genres[j].name)) {
            genreFound = true;
            break;
        }
    }
    if (genreFound) {
        moviesForUser.push(movies[i].original_title);
    }
}

более короткая версия:

let moviesForUser = movies.reduce((result, movie) => {
    if (movie.genres.some(genre => taste.includes(genre.name))) {
        result.push(movie.original_title);
    }
    return result;
}, []);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...