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 相关文章推荐
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
Feb 09 Javascript
js里怎么取select标签里的值并修改
Dec 10 Javascript
caller和callee的区别介绍及演示结果
Mar 10 Javascript
js中substring和substr的详细介绍与用法
Aug 29 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
ajax与json 获取数据并在前台使用简单实例
Jan 19 Javascript
Express系列之multer上传的使用
Oct 27 Javascript
前端防止用户重复提交js实现代码示例
Sep 07 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
Apr 30 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 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中使用接口实现工厂设计模式的代码
2012/06/17 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
Python入门篇之字典
2014/10/17 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
Python3解释器知识点总结
2019/02/19 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
晚会主持词开场白
2014/03/17 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang