Переставьте плоский массив с информацией об уровне в n-арное дерево с детьми - PullRequest
3 голосов
/ 01 августа 2020

Учитывая массив в формате уровней и их непосредственные дочерние элементы, которые хранятся в последовательном массиве, возвращает n-арное дерево

Данный формат ввода:

[{'name':'a', 'level': -1},
    {'name':'b', 'level': 0},
        {'name':'c', 'level': 1},
            {'name':'d', 'level': 2},
    {'name':'e', 'level': 0},
        {'name':'f', 'level': 1},
    {'name':'g', 'level': 0}
];

Ожидаемый результат должен быть в формат ниже:

[
 {
  name:"a",
  level:-1,
  children: [
    {
      name:"b",
      level:0,
      children: [
         {
           name:"c",
           level:1,
           children: [
              {
                  name:"d",
                  level:2,
                  children: [ ]
              }
            ]
         }
       ]
    }
  ],
 },
 {
   name:"e",
   level:1,
   children: [
        {
          name:"f",
          level:2,
          children: [ ]
        }
   ]
 },
 {
   name:"g",
   level:2,
   children: [ ]
 }
]

Рекурсивное решение, которое я пытался реализовать, но не удалось

Код выше возвращает

function treeTraversal(arr, index) {
  if (arr === null || arr.length === 0 || index === arr.length) {
    return;
  }

  let result = [];
  let children = [];
  if (arr[index - 1].level + 1 === arr[index].level) {
    children.push(arr[index]);
    console.log(children);
    treeTraversal(arr, index + 1);
  }
  arr[index - 1].children = children;
  result.push(arr[index - 1]);
  return result;
}

const arr = [{
    'name': 'a',
    'level': -1
  },
  {
    'name': 'b',
    'level': 0
  },
  {
    'name': 'c',
    'level': 1
  },
  {
    'name': 'd',
    'level': 2
  },
  {
    'name': 'e',
    'level': 0
  },
  {
    'name': 'f',
    'level': 1
  },
  {
    'name': 'g',
    'level': 0
  }
];

console.log(treeTraversal(arr, 1));

неожиданные результаты. Пожалуйста, дайте мне знать, что не так с приведенным выше кодом

1 Ответ

3 голосов
/ 01 августа 2020

Вы можете взять вспомогательный массив для уровней и назначить объект последнему массиву уровня плюс один.

var data = [{ name: 'a', level: -1 }, { name: 'b', level: 0 }, { name: 'c', level: 1 }, { name: 'd', level: 2 }, { name: 'e', level: 0 }, { name: 'f', level: 1 }, { name: 'g', level: 0 }],
    tree = [],
    levels = [tree];

data.forEach(o => levels[o.level + 1].push({ ...o, children: levels[o.level + 2] = [] }));

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...