Создайте иерархическое дерево из плоского массива объектов по значению поля - PullRequest
0 голосов
/ 01 апреля 2019

Нужно преобразовать массив вроде:

[
  {value: 'a', depth: 1, children: []},
  {value: 'c', depth: 2, children: []},
  {value: 'd', depth: 2, children: []},
  {value: 'e', depth: 1, children: []},
  {value: 'f', depth: 2, children: []},
  {value: 'g', depth: 3, children: []},
  {value: 'i', depth: 4, children: []},
   // depth can bee any int but the integer row is respected 
  {value: 'j', depth: n, children: []},
   // ...
  {value: 'z', depth: 3, children: []},
]

в:

[
  {value: 'a', depth: 1, children: [
    {value: 'c', depth: 2, children: null},
    {value: 'd', depth: 2, children: null},
  ]},
  {value: 'e', depth: 1, children: [
    {value: 'f', depth: 2, children: [
      {value: 'g', depth: 3, children: [
        {value: 'i', depth: 4, children: [
          {value: 'j', depth: n, children: [
            // ...
          ]},
        ]},
      ]},
      {value: '', depth: 3, children: null},
    ]},
  ]},
]

Любая помощь очень ценится !

Я понимаюЯ должен использовать рекурсивную функцию, но застрял здесь.

1 Ответ

1 голос
/ 01 апреля 2019

Нет необходимости в рекурсии.Вы можете использовать вспомогательный массив для уровней и принять depth в качестве значения на основе нуля (эти значения нуждаются в корректировке).

Выбор отношения родительских детей основывается на порядке, поэтому всегда дети следуютпоследний родитель предыдущего элемента глубины.

var array = [{ value: 'a', depth: 1, children: [] }, { value: 'c', depth: 2, children: [] }, { value: 'd', depth: 2, children: [] }, { value: 'e', depth: 1, children: [] }, { value: 'f', depth: 2, children: [] }, { value: 'g', depth: 3, children: [] }, { value: 'i', depth: 4, children: [] }, { value: 'z', depth: 3, children: [] }],
    result = [],
    levels = [{ children: result }];

array.forEach(o => levels[o.depth - 1].children.push(levels[o.depth] = o));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...