@evg_96

Какой алгоритм фильтрация списка на Javascript?

Есть список например фруктов. Фрукты могут повторяться. Всего например 3 вида фруктов.
Также есть форма с {{ кол-во видов фруктов }} чекбоксами.
Какой алгоритм написания фильтрация этого списка?
Например кликаем на первый чекбокс, отображаются только фрукты соответствующие этому чекбоксу, кликаем на второй, отображаются и первый и второй вид, кликаем на третий, отображаются все фрукты. Обратное при удалении галочки.

Вроде как задача предельно легкая, но в голову не приходит нормальное решение.

Подскажите сам алгоритм решения на словах, как что хранить, когда что изменять, при каких событиях и т.д.
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
@Ridz
Побитовая фильтрация
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
    body{
      background-color: rgba(216, 191, 216, 1);
    }

    .hide{
      display: none;
    }
  </style>


</head>

<body>
<p>Отобразить только имеющие отношение к</p>
  <input type="checkbox" name="1" id="zel" value="001"><label for="zel"  style="color: green">Зеленым</label>
  <input type="checkbox" name="2" id="kras"  value="010"><label for="kras" style="color: red">Красным</label>
  <input type="checkbox" name="3" id="zhelty"  value="100"><label  for="zhelty" style="color: yellow">Желтым</label>


<ul>
<li data-color="001"><a style="color: green" href="">зеленый</a></li>
<li data-color="001"><a style="color: green" href="">зеленый</a></li>
<li data-color="001"><a style="color: green" href="">зеленый</a></li>
<li data-color="010"><a style="color: red" href="">красный</a></li>
<li data-color="010"><a style="color: red" href="">красный</a></li>
<li data-color="010"><a style="color: red" href="">красный</a></li>
<li data-color="010"><a style="color: red" href="">красный</a></li>
<li data-color="100"><a style="color: yellow" href="">желтый</a></li>
<li data-color="100"><a style="color: yellow" href="">желтый</a></li>
<li data-color="100"><a style="color: yellow" href="">желтый</a></li>
  </ul>
<script>
 window.addEventListener("DOMContentLoaded", function() {
    var c = document.querySelectorAll('[type="checkbox"]');
    [].forEach.call(c, function(a) {
        a.addEventListener("change", function() {
            var a = [].reduce.call(c, function(b, a) {
                return a.checked ? b | a.value : b
            }, 0);
            [].forEach.call(document.querySelectorAll("[data-color]"), function(b) {
                b.dataset.color & a ? b.classList.remove("hide") : b.classList.add("hide")
            })
        })
    })
});
</script>
</body>
</html>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Сумма битов через степень двойки.
Присваиваем биты по-порядку (в скобках - бинарный вид числа):
фрукт1 - 1 (001)
фрукт2 - 2 (010)
фрукт3 - 4 (100)

Сумма - это "маска" выборки:
Отобразить все - 7 (1+2+4)
Отобразить только фрукт1 и фрукт2 - 3 (1+2)
Отобразить только фрукт1 и фрукт3 - 5 (1+4)
Отобразить только фрукт2 и фрукт3 - 6 (2+4)
и т.д.
Ответ написан
Комментировать
KorniloFF
@KorniloFF Куратор тега JavaScript
Работаю по font-end / JS
Пробежать по списку чекбоксов, найти выбранный и его id отправить в switch, в котором уже раскладывать что для какого нужно делать.
Ответ написан
Комментировать
@Arik
  • первая функция/метод которая вернет все записи
  • вторая функция/метод которая запросит у первой все записи, но не вернет один тип фруктов
  • третья функция/метод которая запросит у второй функции/метода данные, но дальше не вернет без еще одного типа данных
  • ...
  • чекбоксы запускают функцию/метод, передавая название функции/метода откуда брать данные (наверно лучше через атрибут, например, data-fun-name="")
  • функция/метод что запускают чекбоксы запустит соотв. функцию/метод, получит данные и передаст функции/методу которая собирает список
Ответ написан
Комментировать
@TosterUserName
Вот живой пример с решением Как оставлять в списке только выбранные варианты через чекбоксы?
Может это то, что вы искали.
Ответ написан
Ваш ответ на вопрос

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

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