DOM и React Senior Компоненты на практике обновлено

Поиск по дереву файлов

Условие

Дерево узлов { id, name, children }. Поле поиска фильтрует дерево рекурсивно: папка показывается, если подходит сама или если подходит хоть один потомок; у показанной папки дети тоже отфильтрованы. Пустой запрос показывает всё. Узел рисуется как <div class="node" data-id>, внутри <span class="name">.

Что проверяют тесты

  • показывает всё без запроса

  • находит вложенный файл и оставляет родителя

  • совпадение по имени папки показывает её детей

  • нет совпадений

  • регистр не важен

  • исходное дерево не мутируется

Как подойти

Задача с реального собеседования в Яндексе. Ядро - рекурсивный фильтр, возвращающий новое дерево: сначала фильтруем детей, потом решаем судьбу узла. Тонкость, которую формулировка задаёт неявно: если совпала сама папка, её дети должны остаться целиком, а не быть отфильтрованы по тому же запросу - иначе найденная папка выглядит пустой. Неизменяемость обязательна: вход это пропс. Что назвать вслух: подсветка совпадений, раскрытие найденных веток, debounce при больших деревьях, мемоизация фильтрации.

Подсказки: 3
  1. Фильтрация рекурсивная и возвращает новое дерево, а не помечает старое.
  2. Узел остаётся, если подходит сам или подходит кто-то из потомков.
  3. У совпавшей по имени папки детей обрезать не надо - иначе пользователь не увидит содержимое найденной папки.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.