Treesort dart - переупорядочить список на основе родителей / детей - PullRequest
0 голосов
/ 24 апреля 2020

У меня вопрос: у меня есть такой список:

List flat = [
  { id: 1, parentId: 3 },
  { id: 3, parentId: 8 },
  { id: 4, parentId: 6 },
  { id: 6, parentId: 3 },
  { id: 7, parentId: 6 },
  { id: 8, parentId: null },
  { id: 10, parentId: 8 }, 
  { id: 13, parentId: 14 },
  { id: 14, parentId: 10 }
]

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

[
  { 
    id: 8,
    children: [
      { 
        id: 3, 
        children: [
          { 
            id: 1, 
            children: [] 
          }, 
          { 
            id: 6, 
            children: [ 
              { id: 4, children: [] }, 
              { id: 7, children: [] } 
            ]
          }
        ] 
      },
      { 
        id: 10, 
        children: [ 
          { 
            id: 14, 
            children: [
              { id: 13, children: [] }
            ] 
          }
        ]
      }
    ]
  }
]

Я нашел несколько примеров с javascript, но как мне добиться этого с помощью дротика?

1 Ответ

0 голосов
/ 24 апреля 2020

Как насчет:

 /// Tree-order nodes by their "parentId".
 ///
 /// Returns the root. Assumes there is exactly one root.
 Map<String, dynamic> treeOrder(List<Map<String, dynamic>> nodes) {
  // Each node has a key and a parent. 
  // Change them all to have no parent and a children list.
  var map = <int, Map<String, dynamic>>{};
  for (var node in nodes) {
    map[node["id"]] = node;
    node["children"] = [];
  }
  Map<String, dynamic> result;
  for (var node in nodes) {
    var parentId = node.remove("parentId");
    if (parentId == null) {
      result = node;
    } else {
      map[parentId]["children"].add(node);
    }
  }
  return result;
}

Ничего особенно умного, просто сохранение карты от id до значения для ускорения поиска.

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