HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Следующая операция после отображения списков, такая же по важности операция - это фильтрация. Они часто используются вместе. Давайте её разберём.</p>
1 <p>Следующая операция после отображения списков, такая же по важности операция - это фильтрация. Они часто используются вместе. Давайте её разберём.</p>
2 <p>Самый простой пример в нашей библиотеке - это удаление элемента, например, заголовков.</p>
2 <p>Самый простой пример в нашей библиотеке - это удаление элемента, например, заголовков.</p>
3 <p>Здесь создаётся HTML, в который добавляются ноды двух типов: заголовок и параграф. И после этого применяется функция removeHeaders. В свою очередь она возвращает новый HTML. И если мы его распечатаем, то увидим, что остался только параграф и больше ничего:</p>
3 <p>Здесь создаётся HTML, в который добавляются ноды двух типов: заголовок и параграф. И после этого применяется функция removeHeaders. В свою очередь она возвращает новый HTML. И если мы его распечатаем, то увидим, что остался только параграф и больше ничего:</p>
4 <h2>Удаление тегов</h2>
4 <h2>Удаление тегов</h2>
5 <p>Давайте посмотрим, как устроена внутри эта функция. Она работает практически так же, как и map, за единственным исключением. Мы внутри проверяем, является ли элемент тегом, в данном случае заголовком. Если он является заголовком, то мы рекурсивно вызываем функцию removeHeaders с "хвостом" нашего списка $tailElements. Если нет, то мы вызываем cons и добавляем текущий элемент и рекурсивный вызов "хвоста". Если наш элемент является заголовком, то мы не делаем cons и просто пропускаем его. В конечном итоге нам вернётся список с отфильтрованными значениями.</p>
5 <p>Давайте посмотрим, как устроена внутри эта функция. Она работает практически так же, как и map, за единственным исключением. Мы внутри проверяем, является ли элемент тегом, в данном случае заголовком. Если он является заголовком, то мы рекурсивно вызываем функцию removeHeaders с "хвостом" нашего списка $tailElements. Если нет, то мы вызываем cons и добавляем текущий элемент и рекурсивный вызов "хвоста". Если наш элемент является заголовком, то мы не делаем cons и просто пропускаем его. В конечном итоге нам вернётся список с отфильтрованными значениями.</p>
6 <h2>Фильтрация</h2>
6 <h2>Фильтрация</h2>
7 <p>Эта операция называется filter, также называется функция, которая её выполняет. Иногда её называют и по-другому, но чаще всего именно так. Как видно из картинки, filter не делает никаких преобразований. Задача этой функции исключительно - оставить только то, что нужно.</p>
7 <p>Эта операция называется filter, также называется функция, которая её выполняет. Иногда её называют и по-другому, но чаще всего именно так. Как видно из картинки, filter не делает никаких преобразований. Задача этой функции исключительно - оставить только то, что нужно.</p>
8 <p>Посмотрим реализацию, используя функцию высшего порядка filter, которая производит изменения. Здесь тот же самый пример. Единственное отличие - мы вызываем не removeHeaders, а функцию filter. На вход передаётся 2 параметра: HTML и функция. Это стандарт для подобного вида функций. При этом функция, которую мы передаём, называется<strong>предикат</strong>, потому что она возвращает значение<em>истина</em>или<em>ложь</em>в зависимости от того, нужно ли сохранять элемент. Если она возвращает true, то элемент остаётся в списке, если false, то его не будет в новом списке.</p>
8 <p>Посмотрим реализацию, используя функцию высшего порядка filter, которая производит изменения. Здесь тот же самый пример. Единственное отличие - мы вызываем не removeHeaders, а функцию filter. На вход передаётся 2 параметра: HTML и функция. Это стандарт для подобного вида функций. При этом функция, которую мы передаём, называется<strong>предикат</strong>, потому что она возвращает значение<em>истина</em>или<em>ложь</em>в зависимости от того, нужно ли сохранять элемент. Если она возвращает true, то элемент остаётся в списке, если false, то его не будет в новом списке.</p>
9 <p>Часто эта функция достаточно простая. Наш случай не исключение. Функция делает простую проверку, является ли элемент заголовком второго уровня. И если он этим заголовком не является, то всё хорошо и элемент остаётся в списке. Если мы распечатаем $processedHtml, то будет выведен ожидаемый список с одним элементом - тегом p.</p>
9 <p>Часто эта функция достаточно простая. Наш случай не исключение. Функция делает простую проверку, является ли элемент заголовком второго уровня. И если он этим заголовком не является, то всё хорошо и элемент остаётся в списке. Если мы распечатаем $processedHtml, то будет выведен ожидаемый список с одним элементом - тегом p.</p>
10 <p>Ниже еще несколько примеров использования функции filter:</p>
10 <p>Ниже еще несколько примеров использования функции filter:</p>
11 <h3>Как устроена фильтрация</h3>
11 <h3>Как устроена фильтрация</h3>
12 <p>Посмотрим, как фильтрация устроена внутри. Это фактически тот же самый map. Мы получаем первый элемент с помощью функции head и после этого функцией func делаем проверку. В этом и заключается главное отличие. Если результат этой функции истина, то мы вызываем cons, т.е. добавляем текущий элемент в новый список. Если она возвращает false, то мы рекурсивно запускаем фильтр, пропуская этот элемент.</p>
12 <p>Посмотрим, как фильтрация устроена внутри. Это фактически тот же самый map. Мы получаем первый элемент с помощью функции head и после этого функцией func делаем проверку. В этом и заключается главное отличие. Если результат этой функции истина, то мы вызываем cons, т.е. добавляем текущий элемент в новый список. Если она возвращает false, то мы рекурсивно запускаем фильтр, пропуская этот элемент.</p>