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 相关文章推荐
window.parent调用父框架时 ie跟火狐不兼容问题
Jul 30 Javascript
javascript针对不确定函数的执行方法
Dec 16 Javascript
详解javascript事件冒泡
Jan 09 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
Dec 16 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
js jquery 获取某一元素到浏览器顶端的距离实现方法
Sep 05 jQuery
layui form表单提交之后重新加载数据表格的方法
Sep 11 Javascript
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 Javascript
vant 中van-list的用法说明
Nov 11 Javascript
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
Apr 03 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不用正则采集速度探究总结
2008/03/24 PHP
php 字符转义 注意事项
2009/05/27 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
vue v-on监听事件详解
2017/05/17 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
DBA的职责都有哪些
2012/05/16 面试题
暑期培训心得体会
2014/09/02 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
护士个人年度总结范文
2015/02/13 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
学会感恩主题班会
2015/08/12 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书