Построение дерева из "плоского" массива (Деревья)

Олег Иваненко
Олег Иваненко
134
1
Содержание:
  1. Комментарии
Здравствуйте Александр.
Пересмотрел все Ваши посты примеры кастомных элементов и многие другие темы. Очень понравилось, за что Вам спасибо, очень поучительно, грамотно и главное структурировано и минималистично.
Для своего развития хотел создать класс Tree (дерева), который бы строил структуру предприятия и должностей работников динамически, сохраняя результат действий пользователя в БД. Как всегда не хватает для этого самостоятельного опыта.
Может Вам было бы интересно создать пост на данную тему? Или если она для Вас слишком проста или не интересна дать практическую помощь в виде поэтапной инструкции реализации данной темы. Реализация требуется на JavaScript. Если постановку задачи выразить в нескольких словах, то она была бы такой:
1. Построение дерева динамически, от корня из массива полученного из БД.
2. Добавление узлов дерева как структурных подразделений предприятия, так работников. (пример: при создании узла дерева его потомками может быть сразу должность или другое структурное подразделение, которое в своею очередь может иметь свою вложенность)
3. Редактирование названия узлов и должностей с динамическим сохранением в БД.
4. Изменение состояния узлов (здесь имеется ввиду не удаление элементов дерева, а перевод их в архивное состояние. С целью, что наименование структурного подразделения или должности не изменялось со временем, т.е. код должности или код наименования закрепляется навсегда за этим элементом. А при сокращении должности или реструктуризации подразделения, эти элементы дерева переводились в архивное состояние)
5. Было бы идеально использовать возможность DROP для перемещения элементов и узлов содержащих элементы на другие подуровни с сохранением их новой позиции в БД.
6. И самая главная и тяжело решаемая для меня задача, это связать получившийся список (дерево) с другой сущностью в БД как работник.

Аналогом внешнего вида и функциональности можно было бы взять Ваш пример ToDo. Но как его модифицировать под свою задачу не знаю.

Комментарии: 1

  1. Александр Мальцев
    Александр Мальцев
    2022-11-15 14:31:22
    Здравствуйте!
    Задача интересная, но каких-то наработок для решения такой задачи нет. Тем более она объёмная. Алгоритм вы уже написали.
    Первый пункт вы уже наверно сделали, то есть создали таблички в базе. Для построения дерево нам как минимум нужно знать родительский id узел и его позицию среди детей (например, это можно обозначить полем left):
    • id_node – первичный ключ узла;
    • type – тип узла (1 – подразделение, 2 – должность);
    • id_type – id ключ подразделения или должности;
    • parent – родительский узел;
    • left – положение узла в одном родителе.

    Вопрос касаемый работников, как мне кажется выполняется очень легко. Например, работники у нас содержатся в таблица workers. Работник в организации находится в каком-то подразделении и имеет какую-то должность:
    • id_worker – первичный ключ работника;
    • id_division – id подразделения;
    • id_position – id должности.

    Вывод бинарного дерева похоже на вывод DOM-дерева. Можно это сделать как вывод DOM-структуры или почитать про бинарные деревья и как их строить. Добавить возможность Drag and Drop – это конечно будет круто. Чтобы не выдумывать новый велосипед можно посмотреть может какой-то готовый уже есть.