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 点击按钮自动高亮实现原理及代码
Apr 25 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 Javascript
js实现搜索框关键字智能匹配代码
Mar 26 Javascript
jQuery插件Validation快速完成表单验证的方式
Jul 28 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
Aug 22 Javascript
AngularJS 的$timeout服务示例代码
Sep 21 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
详解webpack import()动态加载模块踩坑
Jul 17 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 Javascript
JavaScript将数组转换为链表的方法
Feb 16 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
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
浅谈React高阶组件
2018/03/28 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
使用Python对Excel进行读写操作
2017/03/30 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
Django的models中on_delete参数详解
2019/07/16 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python Matplotlib模块的使用
2020/09/16 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
银行爱岗敬业演讲稿
2014/05/05 职场文书
节约用水的口号
2014/06/20 职场文书
不同意离婚答辩状
2015/05/22 职场文书
主持稿开场白
2015/06/01 职场文书
民主生活会主持词
2015/07/01 职场文书
酒店温馨提示语
2015/07/14 职场文书
小学同学聚会感言
2015/07/30 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android