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获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
Oct 22 Javascript
使用CSS3的scale实现网页整体缩放
Mar 18 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
纯JS实现本地图片预览的方法
Jul 31 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
Feb 27 Javascript
jquery实现图片轮播器
May 23 jQuery
详解JavaScript的BUG和错误
May 07 Javascript
AngularJS与后端php的数据交互方法
Aug 13 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
Dec 25 Javascript
JS实现判断移动端PC端功能
Feb 21 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 curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
javascript 读取图片文件的大小
2009/06/25 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
Python urlopen 使用小示例
2008/09/06 Python
用python 制作图片转pdf工具
2015/01/30 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
softmax及python实现过程解析
2019/09/30 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
代码中finally中的代码会不会执行
2012/02/06 面试题
大学生创业计划书的范文
2014/01/07 职场文书
承诺书范文
2014/06/03 职场文书
服务口号大全
2014/06/11 职场文书
明星邀请函
2015/02/02 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript