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 相关文章推荐
JQuery 前台切换网站的样式实现
Jun 22 Javascript
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
修改jquery.lazyload.js实现页面延迟载入
Dec 22 Javascript
Node.js的包详细介绍
Jan 14 Javascript
javascript 动态创建表格的2种方法总结
Mar 04 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
微信小程序之拖拽排序(代码分享)
Jan 21 Javascript
vue构建单页面应用实战
Apr 10 Javascript
BootStrap 标题设置跨行无效的解决方法
Oct 25 Javascript
Vue通过懒加载提升页面响应速度
May 10 Vue.js
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调用C#开发的dll类库方法
2014/07/28 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
[原创]图片分页查看
2006/08/28 Javascript
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
Python中的生成器和yield详细介绍
2015/01/09 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
python 写的一个爬虫程序源码
2016/02/28 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
python中web框架的自定义创建
2019/09/08 Python
基于python3实现倒叙字符串
2020/02/18 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
书法培训心得体会
2014/01/05 职场文书
中药专业自荐信范文
2014/03/18 职场文书
火灾现场处置方案
2014/05/28 职场文书
报案材料怎么写
2015/05/25 职场文书
使用Springboot实现健身房管理系统
2021/07/01 Java/Android