@AndrewRusinas

Как отфильтровать массив такого вида?

const arr = [
   {
       category: 'Foo',
       items: [
           {
              name: 'Oops',
              keywords: [ 'bar', 'eggs', 'spam' ]
           },
            {
              name: 'I did it again',
              keywords: [ 'bar', 'britney', 'spears' ]
           },
       ]
   },
   // ... еще объекты
]


Простую фильтрацию я уже сделал:
let filteredEmojies = arr.filter(category => {
    return category.items.some(item => {
         return item.keywords.some(keyword => keyword.includes(filter))
      })
 })


Теперь нужно её дополнить таким образом, чтобы в оставшемся объекте массив items так же был отфильтрован.

То есть, если я фильтрую по строке 'eg', то на выходе у меня останется
[
  {
    category: 'Foo',
    items: [ 
       {
          name: 'Oops',
          keywords: [ 'bar', 'eggs', 'spam' ]
       }
    ]
  }
]


UPD
Дополнил вот так, но присваивание (category.items = ...) меняет оригинальный объект. Как же быть
let filtered = arr.filter(category => {
   category.items = category.items.filter(item => {
         return item.keywords.some(keyword => keyword.includes(filter))
      })
     return category.items.length
})
  • Вопрос задан
  • 219 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const FILTER_VALUE = 'eg';

const filteredArr = arr.reduce((acc, el) => {
  const items = el.items
    .filter(n => n.keywords.some(m => m.includes(FILTER_VALUE)))
    .map(n => ({ ...n, keywords: [...n.keywords] }));

  if (items.length) {
    acc.push({ ...el, items });
  }

  return acc;
}, []);
Ответ написан
Комментировать
devellopah
@devellopah
// делаешь копию
const copy = arr.concat(); 

// мутируешь копию
let filtered = copy.filter(category => {
   category.items = category.items.filter(item => {
         return item.keywords.some(keyword => keyword.includes(filter))
      })
     return category.items.length
})
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы