Преобразовать массив в дерево в Typescript - PullRequest
0 голосов
/ 17 октября 2018

У меня есть структура базы данных в массиве объектов, которые хранятся следующим образом:

 arry = [{"name": "a", "id": "2", "data":"foo", "parent": "1"},
 {"name": "b", "id": "3", "data":"foo", "parent": "2"},
 {"name": "c", "id": "4", "data":"foo", "parent": "3"},
 {"name": "d", "id": "5", "data":"foo", "parent": "3"},
 {"name": "e", "id": "6", "data":"foo", "parent": "4"},
 {"name": "f", "id": "7", "data":"foo", "parent": "5"}]

Мне нужна вложенная структура, подобная этой

{
"2":{
   "name": "a",
   "data": "foo",
  "3":{
     "name": "b",
     "data":"foo",
     "4":{
        "name": "c",
        "data":"foo",
        "6":{
           "name": "e",
           "data": "foo",
          };
       },
      "5":{
         "name": "d",
         "data": "foo",
         "7":{
            "name": "f",
            "data": "foo"
           }
        }
      }
    }
  };

, чтобы я мог использовать ее в дереве угловых материалов.

1 Ответ

0 голосов
/ 17 октября 2018

Для этого вы можете уменьшить ваш массив узлов до словаря, используя id каждого узла в качестве индекса.

Таким образом, все узлы будут доступны по их идентификатору непосредственно в словаре.Таким образом, вы сможете легко хранить каждый узел в его родительском узле.

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

Может случиться, что родительский неОднако в словаре, когда вы анализируете дочерний объект, в этом случае вы можете использовать фиктивный объект, который будет воспроизводить заполнитель, когда мы приступим к анализу фактического родительского узла.

var arry = [
 {"name": "a", "id": "2", "data":"foo", "parent": "1"},
 {"name": "b", "id": "3", "data":"foo", "parent": "2"},
 {"name": "c", "id": "4", "data":"foo", "parent": "3"},
 {"name": "d", "id": "5", "data":"foo", "parent": "3"},
 {"name": "e", "id": "6", "data":"foo", "parent": "4"},
 {"name": "f", "id": "7", "data":"foo", "parent": "5"}
];

function totree(branches, node) {
  // if we don't have the parent yet
  if (!branches[node.parent]) {
    // create a dummy placeholder for now
    branches[node.parent] = {};
  }
  // store our node in its parent
  branches[node.parent][node.id] = node;
  // store our node in the full list
  // copy all added branches on possible placeholder
  branches[node.id] = Object.assign(node, branches[node.id]);

  return branches;
}

var tree = arry.reduce(totree, {})['1']; // get only the root node ('1')

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