@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, всё ок, а если два сразу, что делать?
  • Вопрос задан
  • 136 просмотров
Решения вопроса 2
yarkov
@yarkov
Помог ответ? Отметь решением.
return selectedOptions.includes(item.level_name)
  && selectedOptions.includes(item.lang_name);
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега React
Вместо общего массива выбранных значений сделать отдельные для каждого из свойств.

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

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

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

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

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

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