JavaScript实现无限级递归树的示例代码


Posted in Javascript onMarch 29, 2019

需求

最近遇到一个需求,平时被后台惯着直接返回了树形结构给到前端,前端对这种嵌套类型的数据(如地区的级联或菜单的树形结构)省掉了一层处理。换了个后台开发返回了扁平化的数组数据给到前端自己去处理如下data。突然有点慌......

const data = [
  {
    "area_id": 5,
    "name": "广东省",
    "parent_id": 0,
  }, 
  {
    "area_id": 6,
    "name": "广州市",
    "parent_id": 5,
  },
  {
    "area_id": 7,
    "name": "深圳市",
    "parent_id": 5,
  },
  {
    "area_id": 4,
    "name": "北京市",
    "parent_id": 3,
  },
  {
    "area_id": 3,
    "name": "北京",
    "parent_id": 0,
  },
  {
    "area_id": 2,
    "name": "测试子地区",
    "parent_id": 1,
  },
  {
    "area_id": 1,
    "name": "测试地区",
    "parent_id": 0,
  }
]

JavaScript实现无限级递归树的示例代码

emmm,换个念头想想也刚好锻炼锻炼,撸起袖子干吧,然后就总结了以下两种整理方法~

方法一——递归

在这种那么适合递归的场景,怎么能少了递归这个角色呢?第一种方法,递归出场!献上递归宝器~

function toTreeData(data,pid){
 
  function tree(id) {
    let arr = []
    data.filter(item => {
      return item.parent_id === id;
    }).forEach(item => {
      arr.push({
        area_id: item.area_id,
        label: item.name,
        children: tree(item.area_id)
      })
    })
    return arr
  }
  return tree(pid) // 第一级节点的父id,是null或者0,视情况传入
}

恩,姿势摆好,在控制台里执行一下

JavaScript实现无限级递归树的示例代码

哎哟,不错哦~后台小哥哥再也不担心需要返回什么数据给我了。不过,该方法有个缺点,在我使用组件的时候需要的数据结构中,如果子级没有数据children返回[]。恩,有点问题,但是还是可以优化的,优化的代码我会那么容易给出来吗?你已经是个成熟的程序猿了,需要学会自己优化代码了!!!

方法二——对象

对象在我眼里一直是倚天屠龙宝刀的存在,了解到其中的奥妙便形同有一武林秘籍傍身。当然,没用好就相当于一堆废铁,甚至将导致一些不可预料的结果。

function setTreeData(arr) {
  // 删除所有 children,以防止多次调用
  arr.forEach(function (item) {
      delete item.children;
  });
  let map = {}; // 构建map
  arr.forEach(i => {
    map[i.area_id] = i; // 构建以area_id为键 当前数据为值
  });

  let treeData = [];
  arr.forEach(child => {
    const mapItem = map[child.parent_id]; // 判断当前数据的parent_id是否存在map中

    if (mapItem) { // 存在则表示当前数据不是最顶层数据
    
      // 注意: 这里的map中的数据是引用了arr的它的指向还是arr,当mapItem改变时arr也会改变,踩坑点
      (mapItem.children || ( mapItem.children = [] )).push(child); // 这里判断mapItem中是否存在children, 存在则插入当前数据, 不存在则赋值children为[]然后再插入当前数据
    } else { // 不存在则是组顶层数据
      treeData.push(child);
    }
  });

  return treeData;
};

console.log(setTreeData(data)); // 输出整理后的数据

结果我就不执行了,跟递归的结果相似。相比起递归,我更喜欢这种方法。不过这种方法有一种容易犯错的地方,就是它会改变原数据,我就在这里踩了好久的坑,所以一开始采用了删除children的初始化了一遍。 记住了吗,没记住自行重复说三遍!!!

总结

以上简单介绍了两种将扁平化数据转化为递归树的方法,学会了吗,没学会再回去好好撸撸码!!目前我遇到需要将数据整理树形结构的主要在菜单栏或分类的树形结构上,当然还有像省市这种有从属关系的结构。不过就算以后遇到了都唔驶惊啦~恩,继续更新总结中....

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
UserData用法总结 lanyu出品
Jul 01 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
Mar 19 Javascript
js控制不同的时间段显示不同的css样式的实例代码
Nov 04 Javascript
javascript常用功能汇总
Jul 05 Javascript
jquery模拟多级复选框效果的简单实例
Jun 08 Javascript
Javascript 函数的四种调用模式
Nov 05 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
Jan 05 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
详解easyui基于 layui.laydate日期扩展组件
Jul 18 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
vue模式history下在iis中配置流程
Apr 17 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
Mar 29 #Javascript
详解a标签添加onclick事件的几种方式
Mar 29 #Javascript
node(koa2) web应用模块介绍详解
Mar 29 #Javascript
Vue js 的生命周期(看了就懂)(推荐)
Mar 29 #Javascript
浅谈js闭包理解
Mar 28 #Javascript
微信小程序中转义字符的处理方法
Mar 28 #Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 #Javascript
You might like
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
PHP安全配置
2006/12/06 PHP
php5.3 废弃函数小结
2010/05/16 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
js实现金山打字通小游戏
2020/07/24 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Django框架模板用法入门教程
2019/11/04 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
如何写一个自定义标签
2012/12/28 面试题
机械制造专业个人的自我评价
2013/12/28 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
《包身工》教学反思
2016/02/23 职场文书