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 相关文章推荐
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
js操作textarea 常用方法总结
Dec 03 Javascript
JavaScript中Object.prototype.toString方法的原理
Feb 24 Javascript
JSONP跨域请求实例详解
Jul 04 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
JavaScript注册时密码强度校验代码
Jun 30 Javascript
gulp教程_从入门到项目中快速上手使用方法
Sep 14 Javascript
微信小程序如何获取手机验证码
Nov 04 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
JS如何寻找数组中心索引过程解析
Jun 01 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
javascript中的几个运算符
2007/06/29 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
python模块restful使用方法实例
2013/12/10 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
python 切换root 执行命令的方法
2019/01/19 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
numpy.array 操作使用简单总结
2019/11/08 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
爱护公共设施演讲稿
2014/09/13 职场文书
工程承包协议书
2014/10/20 职场文书
感恩父母主题班会
2015/08/12 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python