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之浮动窗口实现代码(两种方法)
Sep 08 Javascript
javascript与webservice的通信实现代码
Dec 25 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
jquery实现树形二级菜单实例代码
Nov 20 Javascript
Javascript数组Array基础介绍
Mar 13 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
AngularJS 面试题集锦
Sep 06 Javascript
JavaScript实现Fly Bird小游戏
Dec 15 Javascript
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
VUE渲染后端返回含有script标签的html字符串示例
Oct 28 Javascript
layui清除radio的选中状态实例
Nov 14 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(1)
2006/10/09 PHP
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
如何使用php实现评委评分器
2015/07/31 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
表单元素值获取方式js及java方式的简单实例
2016/10/15 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
用JS实现选项卡
2020/03/23 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
python处理PHP数组文本文件实例
2014/09/18 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python中property属性实例解析
2018/02/10 Python
python协程之动态添加任务的方法
2019/02/19 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
struct与class的区别
2014/02/03 面试题
求职自荐信范文格式
2013/11/29 职场文书
30年同学聚会感言
2014/01/30 职场文书
写给导师的自荐信
2015/03/06 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
解析Java中的static关键字
2021/06/14 Java/Android