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 Tools tab使用介绍
Jul 14 Javascript
获取客户端电脑日期时间js代码(jquery)
Sep 12 Javascript
js取得url地址参数实例
Feb 22 Javascript
JS常见问题整理(持续更新)
Aug 06 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
简述jQuery ajax的执行顺序
Jan 05 Javascript
Uploadify上传文件方法
Mar 16 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
Apr 29 Javascript
koa+mongoose实现简单增删改查接口的示例代码
May 13 Javascript
Vue基础学习之项目整合及优化
Jun 02 Javascript
JS实现简单移动端鼠标拖拽
Jul 23 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
CI框架中zip类应用示例
2014/06/17 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
Python随机数random模块使用指南
2016/09/09 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
三年级科学教学反思
2014/01/29 职场文书
期终自我鉴定
2014/02/17 职场文书
元旦寄语大全
2014/04/10 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
新郎婚礼致辞
2015/07/27 职场文书
导游词书写之黄山
2019/08/06 职场文书
python解析json数据
2022/04/29 Python
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript