Javascript - сравнить два массива с фильтром максимально эффективно - PullRequest
1 голос
/ 03 августа 2020

Я хочу сравнить два массива с filter как можно эффективнее и как можно более информативно.

Я уверен, что должен быть хороший способ сделать это, не прибегая к forEach, но хоть убей, я не могу его найти, будет ли кто-нибудь достаточно любезен, чтобы помочь мне избавиться от моих страданий?

Сценарий

mainList array
id : 1, name : 'foo', categories : ["c1","c2","c3"]
id : 2, name : 'bar', categories : ["c1","c4","c5"]

userSelectListNames array "foo"

userSelectListCats массив «c1», «c4»

Фильтр по категориям mainList - здесь я застрял

return mainList.filter(item => userSelectListCats.includes(item.categories));

Я хочу, чтобы пользователь видел обе записи, если он выбрал «c1» и «c4», или «c1» И только последний, если он выберет «c4» и «c5». Но я безнадежно запутался, когда попробовал ...

Мои 2 лучшие попытки ..

return mainList.categories.filter(item => userSelectListCats.includes(item));

Но он возвращает категории, а не mainList.

return mainList.filter(item => mainList.categories.filter(item2 => userSelectListCats.includes(item2)));

Я уверен, что должен быть хороший способ сделать это, не прибегая к forEach, но хоть убей, я не могу найди его, будет ли кто-нибудь достаточно добр, чтобы помочь мне избавиться от моих страданий?

1 Ответ

1 голос
/ 03 августа 2020

Вы можете использовать Array#filter вместе с Array#some.

const arr = [{id : 1, name : 'foo', categories : ["c1","c2","c3"]}, {id : 2, name : 'bar', categories : ["c1","c4","c5"]}];
const userSelectListCats = ["c1", "c4"];
const res = arr.filter(({categories})=>
   userSelectListCats.some(x => categories.includes(x)));
console.log(res);
...