"这篇文档提供了一种将列表数据转换为树形结构的方法,适用于构建如系统区域这样的层次菜单。"
在IT行业中,特别是在开发具有层级关系的数据展示时,例如文件系统、组织架构或地区分类等,经常需要将数据库中存储的扁平化的列表数据转换成树形结构。这个方法主要解决的就是这样的问题。以下是对该方法的详细解释:
1. **方法定义**: `formatTree` 方法接收两个参数,一个是待转换的 List 类型的数据(例如 `List<SysArea>`),另一个是布尔值 `flag`。这个方法的主要任务是将列表中的每个元素(节点)根据其 `pid`(父ID)属性组织成树形结构。
2. **遍历处理**:
- 首先创建一个新的空列表 `nodeList`,用于存储最终的树形结构。
- 使用外层循环遍历原始的 `list`,对每个元素(节点 `node1`)进行处理。
- 内层循环用于检查当前节点 `node1` 是否有子节点(即 `node2`)。如果 `node1` 的 `pid` 等于 `node2` 的 `id`,说明 `node1` 是 `node2` 的子节点。
- 如果找到匹配的父节点,将当前节点添加到父节点的 `children` 列表中,并设置父节点的 `leaf` 属性为 `false`,表示它不是叶子节点。
- `flag` 参数用于控制树的默认展开状态。如果为 `true`,则所有节点默认展开;如果为 `false`,则所有节点默认折叠。
3. **未匹配节点处理**:
- 如果在内层循环中没有找到匹配的父节点,说明 `node1` 是一个顶级节点,将其添加到 `nodeList` 中。
- 同样,根据 `flag` 参数设置节点的 `expanded` 属性。
4. **返回结果**:
- 最后,返回包含树形结构的 `nodeList`。
5. **调用示例**:
- 调用 `formatTree` 方法,传入 `sysAreas` 列表和 `false`,得到转换后的树形列表 `treeList`。这里的 `false` 表示默认所有节点不展开。
6. **实体类**:
- 实体类 `SysArea` 继承了 `BaseEntity`,包含了 `id`(地区代码)、`pid`(父ID)、`name`(地区名称)等属性,以及用于树形结构的辅助属性 `iconCls`(节点图标样式,默认为 "folder")和 `leaf`(是否为叶子节点)。
通过以上步骤,我们可以将一个简单的列表转换为树形结构,便于在前端以层次结构的形式展示,如在菜单、下拉选择器等组件中使用。这个方法在实际开发中非常实用,可以节省大量的编码工作,提高效率。