Фильтрация массива с объектами
Подскажите, пожалуйста, есть массив с объектами который имеет вид:
const arr =[
{ name: 123, ids: [1, 2, 3, 4, 5] },
{ name: 456, ids: [8, 3, 4] },
]
И массив по которому нужно отфильтровать его (он меняется):
const filt = [3, 5, 1];
На выходе ожидаю такой массив:
[
{ name: 123, ids: [1, 3, 5] },
{ name: 456, ids: [3] },
]
Моя попытка была такой, но она неверная:
const newArr = arr.filter((el) => el.ids.filter((el) => filt.includes(el)));
//в таком случае работает, но я изменяю массив, что мне не нужно…
const newArr = arr.filter((el) => {
return (el.ids = el.ids.filter((el) => filt.includes(el)));
});
Ответы (1 шт):
Автор решения: Andrei Khotko
→ Ссылка
Немного модифицировал пример с учетом того, что в массиве arr может быть элемент, у которого ни один из ids не подпадает под критерий фильтра. Получается так:
const arr = [
{ name: 123, ids: [1, 2, 3, 4, 5] },
{ name: 456, ids: [8, 3, 4] },
{ name: 789, ids: [2] },
];
const filt = [3, 5, 1];
const out = arr
.filter(item => item.ids.some(id => filt.includes(id)))
.map(item => {
return {
...item,
ids: item.ids.filter(id => filt.includes(id))
};
});
console.log(JSON.stringify(out, null, 2));
Вывод в консоль:
[
{
"name": 123,
"ids": [
1,
3,
5
]
},
{
"name": 456,
"ids": [
3
]
}
]