树形ort dart – 根据父子关系对列表进行重新排序。

我有一个问题。我有一个这样的List

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 }
]

我想把这个List动态结构化为以下内容。

[
  { 
    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的例子,但我如何用dart来实现?

解决方案:

怎么样。

 /// 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到value的映射,以加快查找速度。

给TA打赏
共{{data.count}}人
人已打赏
未分类

复制& 在纸张之间粘贴

2022-9-8 23:39:43

未分类

通过Lambda函数AddKeyListener

2022-9-8 23:50:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索