Отфильтруйте сложный массив по другому массиву

#javascript #arrays #filter

Вопрос:

 let array1 = [
                {
                    id: 1,
                    genres: [
                        { id: 4, title: "qqqq" },
                        { id: 9, title: "zzzz" },
                        { id: 8, title: "eeee" },
                    ],
                },
                {
                    id: 2,
                    genres: [
                        { id: 2, title: "qwert" },
                        { id: 4, title: "asdf" },
                        { id: 5, title: "zxxcc" },
                    ],
                },
            ];

let array2 = [6, 8];
 

Мне нужно отфильтровать массив1, если идентификатор жанра существует в массиве 2.
Поэтому на выходе у меня должен быть только первый элемент array1.

Как это сделать?

Ответ №1:

Вы можете использовать комбинацию из filter , some и includes :

 let array1 = [{id:1,genres:[{id:4,title:"qqqq" },{id:9,title:"zzzz"},{id:8,title:"eeee" }]},
              {id:2,genres:[{id:2,title:"qwert"},{id:4,title:"asdf"},{id:5,title:"zxxcc"}]}];
let array2 = [6, 8];

let result = array1.filter(({genres}) => genres.some(({id}) => array2.includes(id)));
console.log(result); 

Ответ №2:

Используйте эту filter функцию.

Один из способов сделать это:

 let result = array1.filter(el => {

    let output = false;
    el.genres.forEach( genre => {
        if (array2.includes(genre.id))
            output = true;
    });

    return output;
});
 

Комментарии:

1. Вы также можете добавить разрыв в цикле foreach, чтобы остановить его, если он уже соответствует значению.