Пример предыдущего урока крайне просто обобщить до функции высшего порядка map. Напомню, что map — отображение. Если раньше мы отображали плоские списки, то теперь отобразим вложенную структуру. С точки зрения семантики ничего не меняется. map каждому узлу ставит в соответствие новый узел, так что структура всего дерева остаётся прежней, а вот данные внутри узла меняются.

Преобразование включает в себя следующие шаги:

  1. Переименовать функцию в map;
  2. Добавить в сигнатуру функции передачу функции обработчика;
  3. Пропустить ноду через эту функцию;

Mapping
Trees

При дестракчеринге можно игнорировать отдельные элементы массива (выбирать конкретные значения с учётом порядка). В примере выше мы никак не использовали константу name, то есть в этом случае нам нужно только второе значение массива, поэтому выражение const [name, children] = tree; можно переписать так: const [, children] = tree;, не создавая тем самым лишнюю константу.

Дерево до отображения:

//   A *
//    /|\
// B * C * D
//  /|   |\
// E F   G J

Дерево после отображения:

//   a *
//    /|\
// b * c * d
//  /|   |\
// e f   g j

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

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

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →