Как открепить объект массива узлов с вложенным объектом, который представляет структуру каталогов - PullRequest
0 голосов
/ 03 марта 2020

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

Например, если nodes = [{id: 50, path: "/apple/banana"}], вернуть

{
  "path": "/",
  "children": [
    {
      "path": "/apple",
      "children": [
        {
          "id": 50,
          "path": "/apple/banana",
          "children": []
        }
      ]
    }
  ]
}

У меня есть это:

const tree = { path: '/', children:[] }
const sortedNodes = nodes.sort((a, b) => (a.path.split('/').length - b.path.split('/').length));
sortedNodes.forEach(node => {
  const dirs = node.path.split('/').slice(1)
  let traversed = tree // Hold the reference of tree

  dirs.forEach((dir) => {
    const foundChild = traversed.children.find(child => child.path.split('/').slice().pop() === dir)
    foundChild ? traversed = foundChild : traversed.children.push({ path: node.path, id: node.id, children: [] });   
  })
})
console.log(tree);

1 Ответ

0 голосов
/ 03 марта 2020

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

var nodes = [{ id: 50, path: "/apple/banana" }],
    tree = nodes
        .reduce((t, { id, path }) => {
            path.split(/\//).reduce((r, _, i, p) => {
                var path = p.slice(0, i + 1).join('/') || '/';
                    temp = r.children.find(q => q.path === path);
                if (!temp) r.children.push(temp = { path, children: [] });
                return temp;
            }, t).id = id;
            return t;
        }, { children: [] })
       .children;

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