recursion - Treesort dart - 根据父/子重新排序列表
问题描述
我有一个问题:我有一个这样的列表:
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 找到了多个示例,但是我怎样才能用 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 的映射以加快查找速度。
推荐阅读
- java - 计算一个字符串的更新、插入和删除次数以到达另一个字符串
- swift - 具有动态路径大小的螺旋滚动器
- python - Django 5 星评级系统不保存评论和评级
- image - 在 GCP 中从磁盘创建映像和从快照创建映像有什么区别?
- android - 在框架布局上绘制画布
- flutter - getApplicationSupportDirectory 和 getLibraryDirectory 有什么区别?
- docker - 将带有 nginx 的 ssl 证书放入 docker 时,HTTPS 不起作用
- html - 验证器和错误在 Angular 9 中不起作用
- javascript - 如何在事件单击时为 setState 编写回调函数
- c# - 以原始图片大小从 PictureBox 打印图片