当前位置: 首页 > news >正文

js 组装树形结构

初始数据结构

let data = [{"id": 1,"parentId": 32,"name": "测试1","nodelevel": 0,},{"id": 2,"parentId": 32,"name": "测试2","nodelevel": 3,},{"id": 3,"parentId": 2,"name": "测试2-0","nodelevel": 4,},{"id": 4,"parentId": 2,"name": "测试2-1","nodelevel": 4,},{"id": 6,"parentId": 3,"name": "测试2-0-0","nodelevel": 5,},{"id": 7,"parentId": 3,"name": "测试2-0-1","nodelevel": 5,},{"id": 8,"parentId": 3,"name": "测试2-0-2","nodelevel": 5,},{"id": 9,"parentId": 3,"name": "测试2-0-3","nodelevel": 5,},{"id": 10,"parentId": 3,"name": "测试2-0-4","nodelevel": 5,},{"id": 11,"parentId": 4,"name": "测试2-1-0","nodelevel": 5,},{"id": 12,"parentId": 4,"name": "测试2-1-1","nodelevel": 5,},{"id": 13,"parentId": 4,"name": "测试2-1-2","nodelevel": 5,},{"id": 14,"parentId": 2,"name": "测试2-2","nodelevel": 0,},{"id": 15,"parentId": 2,"name": "测试2-3","nodelevel": 0,},{"id": 16,"parentId": 2,"name": "测试2-4","nodelevel": 0,},{"id": 17,"parentId": 14,"name": "测试2-2-0","nodelevel": 0,},{"id": 18,"parentId": 15,"name": "测试2-3-0","nodelevel": 0,},{"id": 19,"parentId": 16,"name": "测试2-4-0","nodelevel": 0,},{"id": 20,"parentId": 16,"name": "测试2-4-1","nodelevel": 0,},{"id": 21,"parentId": 2,"name": "测试2-5","nodelevel": 0,},{"id": 22,"parentId": 21,"name": "测试2-5-0","nodelevel": 0,},{"id": 23,"parentId": 21,"name": "测试2-5-1","nodelevel": 0,},{"id": 25,"parentId": 2,"name": "测试2-6","nodelevel": 0,},{"id": 26,"parentId": 4,"name": "测试2-1-3","nodelevel": 5,},{"id": 27,"parentId": 25,"name": "技术部1组","nodelevel": 0,},{"id": 28,"parentId": 25,"name": "技术部2组","sortid": 2,"nodelevel": 0,},{"id": 29,"parentId": 21,"name": "投研三部","nodelevel": 0,},{"id": 30,"parentId": 32,"name": "策划部","nodelevel": 0,},{"id": 32,"parentId": 31,"name": "部门","nodelevel": 2,},{"id": 54,"parentId": 2,"name": "A软件部","nodelevel": 0,},{"id": 57,"parentId": 54,"name": "一部1组","nodelevel": 0,},{"id": 58,"parentId": 32,"name": "测试3","nodelevel": 0,},{"id": 59,"parentId": 2,"name": "测试2-7","nodelevel": 0,},{"id": 67,"parentId": 0,"name": "测试部门","nodelevel": 0,},{"id": 69,"parentId": 59,"name": "客1部","nodelevel": 0,},{"id": 70,"parentId": 59,"name": "客2部","sortid": 2,"nodelevel": 0,},{"id": 71,"parentId": 59,"name": "客3部","nodelevel": 0,},{"id": 72,"parentId": 59,"name": "客4部","nodelevel": 0,},{"id": 73,"parentId": 21,"name": "研四部","nodelevel": 0,},{"id": 74,"parentId": 32,"name": "测试4","nodelevel": 0,}
]

实现代码:
这里用的是递归

created(){
const treeData=this.setArrayTree(data,0)
//这里没有根节点数据也存在父节点找不到的情况,所有做过滤  
let data1 = treeData.filter((item) =>treeData.findIndex((o) => o.companyDepartmentId == item.parentid) == -1);},methods: {
// 组装树形结构(这里使用了递归)setArrayTree(data, parentId = '') {const rootItems = data;const childrenOfItem = new Map();for (const item of data) {const parentId = item.parentid;if (!childrenOfItem.has(parentId)) {//map中不存在该数据childrenOfItem.set(parentId, []); //存至map中并赋值为空}childrenOfItem.get(parentId).push(item); //parentId相同的存在一起}// 递归构建子树function addChildren(nodes) {return nodes.map((node) => {return childrenOfItem.get(node.companyDepartmentId)? {...node,children: addChildren(childrenOfItem.get(node.companyDepartmentId) || []),}: node;});}if (typeof parentId === 'number')return addChildren(childrenOfItem.get(parentId) || []);return addChildren(rootItems);},}

非递归实现方法:

created(){
const treeData=this.buildTree(data)
},methods: {//数据组装buildTree(data, parentId = '') {// 检查数据是否为空if (!data || data.length === 0) return [];// 创建一个 Map,用于快速查找节点const nodeMap = new Map();data.forEach((item) => {nodeMap.set(item.companyDepartmentId, item); // 将每个节点存储到 Map 中});// 构建树形结构const tree = [];data.forEach((item) => {// 如果当前节点的 parentId 存在,且 parentId 对应的节点在 Map 中if (nodeMap.has(item.parentid)) {const parent = nodeMap.get(item.parentid);if (!parent.children) {parent.children = []; // 初始化父节点的 children 属性}parent.children.push(item); // 将当前节点添加到父节点的 children 中} else {// 如果当前节点的 parentId 不存在(即根节点),则直接添加到树中tree.push(item);}});return tree;},

获取结果:

[{"id": 32,"parentId": 31,"name": "部门","nodelevel": 2,"children": [{"id": 1,"parentId": 32,"name": "测试1","nodelevel": 0},{"id": 2,"parentId": 32,"name": "测试2","nodelevel": 3,"children": [{"id": 3,"parentId": 2,"name": "测试2-0","nodelevel": 4,"children": [{"id": 6,"parentId": 3,"name": "测试2-0-0","nodelevel": 5},{"id": 7,"parentId": 3,"name": "测试2-0-1","nodelevel": 5},{"id": 8,"parentId": 3,"name": "测试2-0-2","nodelevel": 5},{"id": 9,"parentId": 3,"name": "测试2-0-3","nodelevel": 5},{"id": 10,"parentId": 3,"name": "测试2-0-4","nodelevel": 5}]},{"id": 4,"parentId": 2,"name": "测试2-1","nodelevel": 4,"children": [{"id": 11,"parentId": 4,"name": "测试2-1-0","nodelevel": 5},{"id": 12,"parentId": 4,"name": "测试2-1-1","nodelevel": 5},{"id": 13,"parentId": 4,"name": "测试2-1-2","nodelevel": 5},{"id": 26,"parentId": 4,"name": "测试2-1-3","nodelevel": 5}]},{"id": 14,"parentId": 2,"name": "测试2-2","nodelevel": 0,"children": [{"id": 17,"parentId": 14,"name": "测试2-2-0","nodelevel": 0}]},{"id": 15,"parentId": 2,"name": "测试2-3","nodelevel": 0,"children": [{"id": 18,"parentId": 15,"name": "测试2-3-0","nodelevel": 0}]},{"id": 16,"parentId": 2,"name": "测试2-4","nodelevel": 0,"children": [{"id": 19,"parentId": 16,"name": "测试2-4-0","nodelevel": 0},{"id": 20,"parentId": 16,"name": "测试2-4-1","nodelevel": 0}]},{"id": 21,"parentId": 2,"name": "测试2-5","nodelevel": 0,"children": [{"id": 22,"parentId": 21,"name": "测试2-5-0","nodelevel": 0},{"id": 23,"parentId": 21,"name": "测试2-5-1","nodelevel": 0},{"id": 29,"parentId": 21,"name": "投研三部","nodelevel": 0},{"id": 73,"parentId": 21,"name": "研四部","nodelevel": 0}]},{"id": 25,"parentId": 2,"name": "测试2-6","nodelevel": 0,"children": [{"id": 27,"parentId": 25,"name": "技术部1组","nodelevel": 0},{"id": 28,"parentId": 25,"name": "技术部2组","sortid": 2,"nodelevel": 0}]},{"id": 54,"parentId": 2,"name": "A软件部","nodelevel": 0,"children": [{"id": 57,"parentId": 54,"name": "一部1组","nodelevel": 0}]},{"id": 59,"parentId": 2,"name": "测试2-7","nodelevel": 0,"children": [{"id": 69,"parentId": 59,"name": "客1部","nodelevel": 0},{"id": 70,"parentId": 59,"name": "客2部","sortid": 2,"nodelevel": 0},{"id": 71,"parentId": 59,"name": "客3部","nodelevel": 0},{"id": 72,"parentId": 59,"name": "客4部","nodelevel": 0}]}]},{"id": 30,"parentId": 32,"name": "策划部","nodelevel": 0},{"id": 58,"parentId": 32,"name": "测试3","nodelevel": 0},{"id": 74,"parentId": 32,"name": "测试4","nodelevel": 0}]},{"id": 67,"parentId": 0,"name": "测试部门","nodelevel": 0}
]

相关文章:

  • 专做苹果二手手机的网站百度主页
  • 免备案手机网站杭州seo中心
  • 大连seo建站公司最有效的恶意点击软件
  • 网站的英文版怎么做的赣州seo外包怎么收费
  • 主机屋如何做网站游戏代理平台哪个好
  • 免费建站工具有哪些如何制作网页链接教程
  • Mac安装Apache CXF的时候报错:/Library/Internet: No such file or directory
  • Windows下Zookeeper客户端启动缓慢问题分析与解决方案
  • Python训练营-Day33
  • 在ASP.NET Core WebApi中使用标识框架(Identity)
  • 对象实例化内存布局与访问定位
  • spring项目启动sheel脚本
  • SpringBoot 数据库连接池与 ManticoreSearch 兼容性测试
  • 本地如何安装midscene.js运行环境
  • Liunx操作系统笔记2
  • 【AI论文】从跨领域视角重新审视强化学习在大型语言模型推理中的应用
  • 【实时Linux实战系列】基于实时Linux的音频处理应用开发
  • BGP边界网关协议
  • 深度图聚类DGC—Paper Notes
  • Windows所有系统自带.NET Framework版本win7,win10,win11预装.NET版本
  • CommunityToolkit.Mvvm 重构激光直写控制软件
  • Jenkins 常用定时构建脚本
  • 电商导购app平台的缓存策略与性能优化方案:架构师的实践经验
  • 将Python Tkinter程序转换为手机可运行的Web应用 - 详细教程
  • 激光束修复手机屏任意层不良区域,实现液晶线路激光修复原理
  • wordpress Contact Form 7表单插件设置使用教程