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 相关文章推荐
javascript 打印页面代码
Mar 24 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
最新28个很棒的jQuery 教程
May 28 Javascript
简单的两种Extjs formpanel加载数据的方式
Nov 09 Javascript
js生成的验证码的实现与技术分析
Sep 17 Javascript
JavaScript判断用户是否对表单进行了修改的方法
Mar 18 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 Javascript
谈一谈javascript闭包
Jan 28 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
同步异步动态引入js文件的几种方法总结
Sep 23 Javascript
canvas实现图像放大镜
Feb 06 Javascript
详解Vue 方法与事件处理器
Jun 20 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
浅谈php调用python文件
2019/03/29 PHP
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
如何用javascript计算文本框还能输入多少个字符
2015/07/29 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Python实现类继承实例
2014/07/04 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python属性和内建属性实例解析
2020/01/14 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
彪马美国官网:PUMA美国
2017/03/09 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
《母鸡》教学反思
2014/02/25 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2015年企业工作总结范文
2015/04/28 职场文书
化妆品促销活动总结
2015/05/07 职场文书
西柏坡观后感
2015/06/08 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python