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中表单的使用小结
Jan 11 Javascript
jquery预览图片实现鼠标放上去显示实际大小
Jan 16 Javascript
js实现跨域的多种方法
Dec 25 Javascript
js读取json文件片段中的数据实例
Mar 09 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
js插件实现图片滑动验证码
Sep 29 Javascript
vue+element 模态框表格形式的可编辑表单实现
Jun 07 Javascript
Vue商品控件与购物车联动效果的实例代码
Jul 21 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
如何在JavaScript中等分数组的实现
Dec 13 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接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
Ajax 数据请求的简单分析
2011/04/05 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
Python上传package到Pypi(代码简单)
2016/02/06 Python
python如何查看系统网络流量的信息
2016/09/12 Python
python运行其他程序的实现方法
2017/07/14 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
Python如何读取、写入JSON数据
2020/07/28 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
详解pandas映射与数据转换
2021/01/22 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
实习自我鉴定
2013/12/15 职场文书
2014年行政工作总结
2014/11/19 职场文书
简历自我评价范文
2019/04/24 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
python3操作redis实现List列表实例
2021/08/04 Python