Мы все были там. Мы не можем понять, почему наш код не работает, и пришло время погуглить его. Но примеры, которые мы находим, часто на один шаг меньше нужного нам ответа.

В Интернете есть много примеров нацеливания на определенные объекты в массиве объектов на основе определенных пар ключ-значение. Но это так же глубоко, как и общие примеры. Это оставляет нас на один шаг меньше в ситуациях, когда пара ключ-значение имеет массив значений.

В этой статье делается следующий шаг и показано, как фильтровать объекты в массиве на основе значений в массиве ключ-значение. В конце также есть ссылка на полный пример кода.

Обзор того, что мы знаем

Итак, мы знаем, как находить объекты в массиве объектов с определенной парой ключ-значение, но на всякий случай повторим.

Допустим, мы работаем с базой отдыха на их сайте бронирования. Клиент хочет заказать детскую вечеринку и знает, что на ней будет 15 детей.

const recActivities = [
    { name:’Swimming’, ages: [6, 7, 8], maxCap: 10 },
    { name:’Skating’, ages: [8, 9, 10], maxCap: 20 },
    { name:’Open Gym’, ages: [10, 11, 12], maxCap: 30 }
];
const largeGroup = recActivities.filter(activity => (activity.maxCap > 15)); 

Мы хотим найти все мероприятия, которые могут вместить 15 или более детей.

Используя базовый метод filter(), мы просматриваем каждый объект в массиве и оцениваем, может ли максимальная вместимость каждого действия (пара ключ-значение maxCap) обрабатывать 15 детей. Если значение превышает 15 детей, мы сохраняем активность как результат в нашем новом массиве largeGroup.

Легко, верно? Прохладный. Идем дальше…

Более глубокая проблема

Хорошо, теперь давайте предположим, что нам нужно filter() занятия в центре отдыха, чтобы вместо этого найти что-то подходящее для возраста. Мы хотим фильтровать() объекты в массиве recActivities, чтобы найти только те, которые относятся к определенному возрасту. Но мы не можем искать пары ключ-значение, содержащие массивы, так же, как мы это делали выше.

Итак, как мы это делаем?

Решение

В дело вступает метод includes(). Он узнает, существует ли определенное значение в массиве, и вернет true или false. Таким образом, в сочетании с filter() мы можем использовать магию поиска:

const recActivities = [
    { name:’Swimming’, ages: [6, 7, 8], maxCap: 10 },
    { name:’Skating’, ages: [8, 9, 10], maxCap: 20 },
    { name:’Open Gym’, ages: [10, 11, 12], maxCap: 30 }
];
const ageAppropriate = recActivities.filter(activity => (activity.ages.includes(8)));

Давайте разберем это.

const ageAppropriate =: здесь мы создаем переменную с именем ageAppropriate, где будет жить наш новый массив объектов активности, соответствующих возрасту.

recActivities.filter: таким образом мы filter() существующий массив действий и создаем новый массив только из тех объектов, которые прошли тест (следующее!).

(activity =› (activity.ages.includes(8))); : это функция/тест, который мы запускаем для каждого действия (каждого объекта в массиве recActivities). Для каждого «стареющего» ключа объекта мы запускаем метод includes() для массива значений. Если он содержит искомое значение, в данном случае целое число 8 (для 8 лет), то он сохранит этот объект для нового массива, поскольку он вернул true (это означает, что он передал контрольная работа).

Если мы console.log(ageAppropriate), массив будет содержать только действия, подходящие для детей в возрасте 8 лет.

Вот и все!

Чтобы увидеть полный пример кода, перейдите здесь.

Чтобы узнать больше о методе filter(), ознакомьтесь с документацией MDN здесь.

Чтобы узнать больше о методе includes(), ознакомьтесь с документацией MDN здесь.

Удачи!