toohappy
@toohappy
Люблю свекольник.

Как отфильтровать данный объект?

Подскажите пожалуйста как отфильтровать данный объект?
Результат должен вернуть массив с объектами, которые содержат данные категории. ['category 5', 'category 6']
Спасибо.

let users = [
  {
    name: 'user 1',
    services: [
      {
        title: 'service 1',
        categories: ['category 1', 'category 2']
      },
      {
        title: 'service 2',
        categories: ['category 3', 'category 4']
      },
      {
        title: 'service 3',
        categories: ['category 5', 'category 6']
      }
    ]
  },
  {
    name: 'user 2',
    services: [
      {
        title: 'service 4',
        categories: ['category 7', 'category 8']
      },
      {
        title: 'service 5',
        categories: ['category 9', 'category 10']
      },
      {
        title: 'service 6',
        categories: ['category 11', 'category 12']
      }
    ]
  }
];

let filterBy = ['category 5', 'category 6']; // отфильтровать на наличие данных категорий в объекте.
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Непонятно, что конкретно надо. Варианты-то разные есть. Например:

  1. Один из элементов services должен содержать все категории, указанные в filterBy:

    users.filter(u => u.services.some(s => filterBy.every(f => s.categories.includes(f))))

  2. Должны присутствовать все категории, указанные в filterBy, но распределены по элементам services они могут быть произвольным образом:

    users.filter(u => filterBy.every(f => u.services.some(s => s.categories.includes(f))))

  3. Достаточно присутствия любой из категорий, указанных в filterBy, в любом из элементов services:

    users.filter(u => filterBy.some(f => u.services.some(s => s.categories.includes(f))))

и т.д.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
const filtered = users.filter(user => 
    filterBy.every(cat => 
        user.services.some(service => 
            service.categories.includes(cat))));


Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
toohappy
@toohappy Автор вопроса
Люблю свекольник.
Решил. Если есть лучший способ, пишите, не стесняйтесь.
let users = [
  {
    name: 'user 1',
    services: [
      {
        title: 'service 1',
        categories: ['category 1', 'category 2']
      },
      {
        title: 'service 2',
        categories: ['category 3', 'category 4']
      },
      {
        title: 'service 3',
        categories: ['category 5', 'category 6', 'category 11']
      }
    ]
  },
  {
    name: 'user 2',
    services: [
      {
        title: 'service 4',
        categories: ['category 7', 'category 8']
      },
      {
        title: 'service 5',
        categories: ['category 9', 'category 10']
      },
      {
        title: 'service 6',
        categories: ['category 11', 'category 12']
      }
    ]
  }
];

let filterBy = ['category 5', 'category 6', 'category 11'];
let usersUPD = [];

for (let item of users) {
  for (let item2 of item.services) {
    if (item2.categories.some(i => filterBy.includes(i))) {
      usersUPD.push(item)
    }
  }
}

console.log(usersUPD)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы