• Множественная фильтрация DOM на JS Vanilla?

    @Singme Автор вопроса
    Господа, пришёл к ответу.

    // Получаем все 18 строчек li. Преобразовываем NodeList в массив, чтобы работали функции высшего порядка (filter, forEach, Map, Reduce)
    let filterLiCollection = [...document.querySelectorAll(".exTasksLi")];
     
    // Здесь мы получаем 10 кнопок, пробегаемся через forEach и ставим слушатель на click.
    //Чтобы знать, как поступать с той или иной кнопкой, идентифицировать её, мы получаем класс, который на каждой кнопке свой, он выглядит так (filter-spoller-a-9-class) на кнопках с классами, и так (filter-spoller-a-math-subject) на кнопках с предметами. С помощью split делим строку по дефисам и берём из массива слово/цифру, в зависимости от кнопки.
    //С помощью тернарного оператора проверяем этот символ и вызываем функцию, аргументов передавая это значение
    document.querySelectorAll(".filter-spoller-a-all").forEach((e) => {
      e.addEventListener("click", (eve) => {
        let partClass = e.classList[0].split("-")[3];
        partClass == "7" ? filterThis("7") : false;
        partClass == "8" ? filterThis("8") : false;
        partClass == "9" ? filterThis("9") : false;
        partClass == "10" ? filterThis("10") : false;
        partClass == "math" ? filterThis("math") : false;
        partClass == "chemistry" ? filterThis("chemistry") : false;
        partClass == "biology" ? filterThis("biology") : false;
        partClass == "informatics" ? filterThis("informatics") : false;
        partClass == "physics" ? filterThis("physics") : false;
        partClass == "ruLang" ? filterThis("ruLang") : false;
      }),
        false;
    });
    
    
    // Это функция, которая принимает число или слова, в зависимости от нажатой кнопки.
    const filterThis = (num) => {
    //пробегаемся по всему массиву с li элементами
      filterLiCollection.forEach((e) => {
      //Делаем проверку, чтобы ниженаписанная логика относилась только к своим элементам (без этой проверки не робит)
        if (
          num == "math" ||
          num == "chemistry" ||
          num == "biology" ||
          num == "informatics" ||
          num == "physics" ||
          num == "ruLang"
        ) {
        //здесь фильтрация, которая отбирает те элементы, которые не являются нашей целью. Отбираются, чтобы их скрыть
          let ewq = filterLiCollection.filter(
            (filter) => filter.dataset.subject !== num
          );
          // Здесь удаляются display-none ТОЛЬКО с тех элементов, которые относятся непосредственно к выбору предмета. Это позволит нам выбрать класс, который сузит поиск до 5 элементов, потом выбрать предмет и перевыбирать его. Он будет перезаписываться. Без этого, уже после двух кликов по фильтрам лист окажется пустым.
          filterLiCollection.forEach((el) => el.classList.remove("subject-none"));
    //Здесь мы получаем текст в споллере, чтобы менять его на текущий предмет
          let subjTitle = document.querySelector(".title-subject");
          num == "math" ? (subjTitle.innerHTML = `Математика`) : console.log("");
          num == "chemistry" ? (subjTitle.innerHTML = `Химия`) : console.log("");
          num == "biology" ? (subjTitle.innerHTML = `Биология`) : console.log("");
          num == "informatics"
            ? (subjTitle.innerHTML = `Информатика`)
            : console.log("");
          num == "physics" ? (subjTitle.innerHTML = `Физика`) : console.log("");
          num == "ruLang"
            ? (subjTitle.innerHTML = `Русский язык`)
            : console.log("");
         //Здесь мы добавляем класс, который будет скрывать те элементы, которые мы не выбирали.
          ewq.forEach((el) => el.classList.add("subject-none"));
          console.log(ewq);
        }
      });
      //Тут всё то же самое, что и в коде выше.
      if (num == "7" || num == "8" || num == "9" || num == "10") {
        filterLiCollection.forEach((el) => el.classList.remove("class-none"));
        let ewq = filterLiCollection.filter(
          (filter) => filter.dataset.class !== num
        );
        document.querySelector(".title-class").innerHTML = `${num} класс`;
        ewq.forEach((el) => el.classList.add("class-none"));
        console.log(ewq);
      }
    };
    Ответ написан
    Комментировать