Создание древовидной структуры в Json с помощью рекурсии - PullRequest
0 голосов
/ 03 марта 2020

Я изо всех сил пытаюсь разобраться с этим, у меня было несколько попыток, и я потерпел неудачу.

В основном у меня есть список сотрудников в базе данных, каждый с идентификатором. Сотрудник может иметь родительского сотрудника (см. Менеджера).

Мне нужно вывести структуру в виде дерева в формате json, как показано в этом URL

https://raw.githubusercontent.com/bumbeishvili/Assets/master/Projects/D3/Organization%20Chart/redesignedChartLongData.json

Вот очень базовый c пример структуры enter image description here

1 Ответ

1 голос
/ 03 марта 2020

JSON может иметь такую ​​структуру, содержащую массив сотрудников:

{
    "employees":[
        {
            "id": 1764,
            "name": "Maaz",
            ... //other fields... this employee has no parent field or
            // "parent" : 0 (invalid value)
        },
        {
            "id": 1765,
            "parent": 1764,
             //other fields... this employee has Maaz as parent
        }
    ]
}

"parent" может быть просто необязательным полем сотрудника, содержащим id родительского элемента employee.

Если бы json имел рекурсию (то есть "parent": { /*...*/ }), это могло бы создать несколько проблем, таких как:

  • Будет ли родительский сотрудник сохранен только как второй уровень, или также появиться в списке как верхний уровень? Это добавляет избыточность или, наоборот, сложность поиска. потому что, если 1764 появляется только как потомок 1765, вам придется потенциально рекурсивно пройти через все дерево списка, чтобы найти любого сотрудника.
  • Какова максимальная глубина рекурсии? С проблемами прохождения.
  • Несоответствие или циклические отношения, приводящие к петлям. Если A является родительским для B, а B является родительским для A. Или если имеется избыточность, но при удалении сотрудник не стирается нигде.
  • Более сложные операции: если у вас есть цепочка из 5 сотрудников типа «родители-потомки» и удалить верхний, что вы делаете с остальными? Вы должны были бы определить политику. И корректируйте дерево каждый раз.

С другой стороны, плоский список потребовал всего 2 O (n) поиска, когда вы ищете, например, сотрудника 1765. Затем вы найдете его родительский идентификатор и выполните поиск снова список для сотрудника с идентификатором чем, если он существует.

При добавлении сотрудника добавьте без родительского поля и отредактируйте его позже. Когда вы удаляете сотрудника, просто удалите его, и возможные неработающие ссылки будут найдены во время (плоского) времени поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...