Задать вопрос
@aliaksandr-go

Как осуществлять фильтрацию по нескольким свойствам?

Имеется массив:

65e17fefef4d8508081301.png
Пытаюсь сделать, чтобы через чекбоксы можно было выбирать и Languages и Level:

65e1801ece47f465015058.png
Обновление массива выбранных значений и фильтрация:

const [selectedOptions, setSelectedOptions] = useState([]);

    const handleCheckboxChange = (e) => {
        const value = e.target.value;

        setSelectedOptions((prevSelected) => {
            if (prevSelected.includes(value)) {
                return prevSelected.filter((option) => option !== value);
            } else {
                return [...prevSelected, value];
            }
        });
    };

    const filteredData = sitterStore.filter((item) => {
        if (selectedOptions.length === 0) {
            return true;
        } else {
            return selectedOptions.includes(item.level_name);
        }
    });

Создание чекбоксов:

{sitterStore.map((item, index) =>
                    <>
                        <label className='checkbox-label'>
                            <input
                                type="checkbox"
                                value={item.lang_name}
                                checked={selectedOptions.includes('lang_name')}
                                data-key={`lang_name`}
                                onChange={(e) => handleCheckboxChange(e)}
                                className='checkbox-input'/>
                            {item.lang_name}
                        </label>
                    </>
                )}

Вот тут:

return selectedOptions.includes(item.level_name);

если проверяю одно свойство, level или language, всё ок, а если два сразу, что делать?
  • Вопрос задан
  • 151 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Javascript.ru
    Курс по React
    5 недель
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 2
yarkov
@yarkov
Помог ответ? Отметь решением.
return selectedOptions.includes(item.level_name)
  && selectedOptions.includes(item.lang_name);
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега React
Вместо общего массива выбранных значений сделать отдельные для каждого из свойств.

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

Чтобы поменьше копипастить, оформить чекбоксы в отдельный компонент - принимает массив доступных значений, массив выбранных значений, функцию установки выбранных значений.

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

https://jsfiddle.net/bqyxa0kL/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽