dim2Tree
dim2Tree方法将多维度数据(维表)直接转换为树形结构。内部依次调用 dim2List 和 list2Tree 完成转换。
语法
javascript
dim2Tree(dimList, dimLink, dimMap)描述
dim2Tree 是一个组合函数,用于将多维度数据(维表)直接转换为具有层级关系的树形结构。该函数内部首先调用 dim2List 将维度数据转换为带有父子关系的平铺节点列表,然后再调用 list2Tree 将平铺列表组装为树形结构。
这种设计将"维度数据 → 平铺列表 → 树形结构"的转换流程封装为一个简单的调用,适用于需要直接从数据库查询结果(如地区信息、组织架构、产品分类)生成前端树形控件的场景。
由于内部调用了 dim2List 和 list2Tree,时间复杂度为 O(m × k) + O(n),其中 m 是 dimList 的长度,k 是 dimLink 的长度,n 是去重后的节点数量。
注意事项
- 三个参数都必须提供,且
dimList和dimLink必须是数组,dimMap必须是对象,否则会返回空数组 dimLink中的维度名称必须与dimMap的键对应,否则该维度会被忽略- 顶层节点的
parentId在dim2List阶段会被设置为'-1',因此list2Tree会将其识别为根节点 - 内部使用
uniqBy对节点按id去重,确保每个 ID 只对应一个节点 - 节点的
id由当前层级及之前所有层级的编码连接而成,保证唯一性 - 该函数依赖 ramda 的
uniqBy函数
示例
基本用法
三级层级结构
浏览器兼容
dim2Tree 内部使用了现代 JavaScript 特性(Map、解构赋值等),需要支持 ES6 的浏览器环境:
- Chrome 51+
- Firefox 52+
- Safari 10+
- Edge 15+
不支持 IE 浏览器。
性能考虑
- 时间复杂度: O(m × k) + O(n) - 其中 m 是 dimList 的长度,k 是 dimLink 的长度,n 是去重后的节点数量
- 空间复杂度: O(n) - 需要存储中间列表和最终的树形结构
- 内部调用
dim2List和list2Tree,两个函数均使用 Map 进行快速查找 - 对于大型数据集,建议先对数据进行预处理或分页,避免一次性处理过多数据
- 由于去重操作的存在,输入数据中存在重复维度组合时不会产生重复节点
相关函数
dim2List- 将多维度数据转换为平铺列表list2Tree- 将平铺列表转换为树形结构tree2List- 将树形结构转换为平铺列表treeFilter- 筛选树形结构中的节点treeCutLevel- 裁剪树形结构到指定层级