toTree method

Iterable<Map> toTree({
  1. String idKey = kTreeIdKey,
  2. String pidKey = kTreePidKey,
  3. String childrenKey = kTreeChildrenKey,
  4. String? rootId,
})

将列表转换为树

Implementation

Iterable<Map> toTree({
  String idKey = kTreeIdKey,
  String pidKey = kTreePidKey,
  String childrenKey = kTreeChildrenKey,
  String? rootId,
}) {
  final List<Map> nodes = [...this];

  final Map<String, Map> nodeMap = {};
  for (var node in nodes) {
    nodeMap[node[idKey]] = {...node};
  }

  final List<Map> tree = [];
  for (var node in nodeMap.values) {
    final String? parentId = node[pidKey];
    if (parentId == rootId || parentId == null || parentId.isEmpty) {
      tree.add(node);
    } else {
      // 通过映射表快速找到父节点
      final Map? parentNode = nodeMap[parentId]?.cast<String, dynamic>();
      if (parentNode != null) {
        (parentNode[childrenKey] ??= <Map>[]).add(node);
      }
    }
  }

  return tree;
}