js实现无限层级树形数据结构(创新算法)


Posted in Javascript onFebruary 27, 2020

由于做项目的需要,把一个线性数组转成树形数组,在网上查了很多文章,觉得他们写的太复杂了,于是自己写了一个,在折腾了一下午终于把它写出来啦(激动.gif),用两个filter过滤器就搞定了,代码简洁明了,数据结构小白都能看懂。

js代码:把扁平数据转成树形数据

function setTreeData(source){
  let cloneData = JSON.parse(JSON.stringify(source))   // 对源数据深度克隆
  return cloneData.filter(father=>{           // 循环所有项,并添加children属性
    let branchArr = cloneData.filter(child=> father.id == child.parentId);  // 返回每一项的子级数组
    branchArr.length>0 ? father.children=branchArr : ''  //给父级添加一个children属性,并赋值
    return father.parentId==0;   //返回第一层
  });
}

根据网友给我指出的问题,之前的算法会影响到源数据,之后我对获取的数据进行了深度克隆,完美解决。

封装函数:

function treeData(source, id, parentId, children){  
  let cloneData = JSON.parse(JSON.stringify(source))
  return cloneData.filter(father=>{
    let branchArr = cloneData.filter(child => father[id] == child[parentId]);
    branchArr.length>0 ? father[children] = branchArr : ''
    return father[parentId] == 0    // 如果第一层不是parentId=0,请自行修改
  })
}
 
// 调用时,字段名以字符串的形式传参,如treeData(source, 'id', 'parentId', 'children')

实例1:使用element-ui的组件制作一个树形多级嵌套伸缩菜单栏

实现效果:

js实现无限层级树形数据结构(创新算法)

vue组件:

<template>
 <el-tree
  :data="treeData"
  :props="defaultProps"
  accordion
  @node-click="handleNodeClick">
 </el-tree>
</template>
 
<script>
  export default {
    name: "Test",
   data(){
    return {
     data : [
      {id:1,parentId:0,name:"一级菜单A",rank:1},
      {id:2,parentId:0,name:"一级菜单B",rank:1},
      {id:3,parentId:0,name:"一级菜单C",rank:1},
      {id:4,parentId:1,name:"二级菜单A-A",rank:2},
      {id:5,parentId:1,name:"二级菜单A-B",rank:2},
      {id:6,parentId:2,name:"二级菜单B-A",rank:2},
      {id:7,parentId:4,name:"三级菜单A-A-A",rank:3},
      {id:8,parentId:7,name:"四级菜单A-A-A-A",rank:4},
      {id:9,parentId:8,name:"五级菜单A-A-A-A-A",rank:5},
      {id:10,parentId:9,name:"六级菜单A-A-A-A-A-A",rank:6},
      {id:11,parentId:10,name:"七级菜单A-A-A-A-A-A-A",rank:7},
      {id:12,parentId:11,name:"八级菜单A-A-A-A-A-A-A-A",rank:8},
      {id:13,parentId:12,name:"九级菜单A-A-A-A-A-A-A-A-A",rank:9},
      {id:14,parentId:13,name:"十级菜单A-A-A-A-A-A-A-A-A-A",rank:10},
     ],
     defaultProps: {
      children: 'children',
      label: 'name'
     }
    }
   },
   computed:{
    treeData(){
     let cloneData = JSON.parse(JSON.stringify(this.data))  // 对源数据深度克隆
     return cloneData.filter(father=>{        
      let branchArr = cloneData.filter(child=>father.id == child.parentId)  //返回每一项的子级数组
      branchArr.length>0 ? father.children = branchArr : ''  //如果存在子级,则给父级添加一个children属性,并赋值
      return father.parentId==0;   //返回第一层
     });
    }
   },
   methods:{
    handleNodeClick(data){
     // console.log(data)
     console.log(this.treeData)
    }
   },
   mounted(){
   }
  }
</script>
 
<style scoped>
 
</style>
Javascript 相关文章推荐
JS类定义原型方法的两种实现的区别评论很多
Sep 12 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
Oct 13 Javascript
JS等比例缩小图片尺寸的实例
Feb 27 Javascript
图标线性回归斜着移动到指定的位置
Aug 16 Javascript
纯css+js写的一个简单的tab标签页带样式
Jan 28 Javascript
JS实现跟随鼠标闪烁转动色块的方法
Feb 26 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
简单的jQuery入门指引
Jul 28 Javascript
跟我学习javascript的隐式强制转换
Nov 16 Javascript
初识angular框架后的所思所想
Feb 19 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
Aug 29 Javascript
JS字符串补全方法padStart()和padEnd()
May 27 Javascript
js实现树形数据转成扁平数据的方法示例
Feb 27 #Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 #Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
Feb 27 #Javascript
ElementUI中el-tree节点的操作的实现
Feb 27 #Javascript
element el-tree组件的动态加载、新增、更新节点的实现
Feb 27 #Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 #Javascript
微信小程序录音实现功能并上传(使用node解析接收)
Feb 26 #Javascript
You might like
在PHP中使用灵巧的体系结构
2006/10/09 PHP
PHP 编程安全性小结
2010/01/08 PHP
PHP学习之正则表达式
2011/04/17 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
javascript eval函数深入认识
2009/02/21 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
python中global与nonlocal比较
2014/11/21 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
水利水电专业自荐信
2014/07/08 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
2016公司年会主持词
2015/07/01 职场文书
参加招聘会后的感想
2015/08/10 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
MySQL创建管理LIST分区
2022/04/13 MySQL