如何将JavaScript将数组转为树形结构


Posted in Javascript onJune 02, 2021

1.需求

后台给了一个这样的数据让咱前端去转换为树形结构(没有重复数据)。不多说,先来看看给了一个怎样的数组数据,转换为怎样的树形结构。

服务器传过来的数组

const arr = [
      [
        {"deptId":"D019",
        "deptName":"销售部"},
        {"deptId":"D019101",
        "deptName":"华北销售中心"}
      ],[
        {"deptId":"D083",
        "deptName":"音乐事业部"}
      ],[
        {"deptId":"D027",
        "deptName":"杭州研究院"},
        {"deptId":"D027048",
        "deptName":"技术工程事业部"},
        {"deptId":"D027048002",
        "deptName":"项目管理中心"}
      ],[
        {"deptId":"D027",
        "deptName":"杭州研究院"},
        {"deptId":"D027048",
        "deptName":"技术工程事业部"}
      ],[
        {"deptId":"D027",
        "deptName":"杭州研究院"},
        {"deptId":"D027048",
        "deptName":"技术工程事业部"}
      ]
    ]

最终转换为

const arr = [
    {
      deptId: 'D019',
      deptName: '销售部',
      children: [{
        deptId: 'D019101',
        deptName: '华北销售中心',
        children: [],
      }]
    },
    {
      deptId: 'D083',
      deptName: '音乐事业部',
      children: []
    },
    {
      deptId: 'D027',
      deptName: '杭州研究院',
      children: [{
        deptId: 'D027048',
        deptName: '技术工程事业部',
        children: [{
          deptId: 'D027048002',
          deptName: '项目管理中心',
          children: []
        }]
      }]
    },
  ]

2.上代码(在reactHooks中开发)

const [treeData, setTreeData] = useState([]);
  console.log(treeData); //treeData为最终需要的树形结构,(在我本地浏览器打印出来是正确的)
  
  useEffect(() => {
    const str = '[[{"deptId":"D019","deptName":"销售部"},{"deptId":"D019101","deptName":"华北销售中心"}],[{"deptId":"D019","deptName":"销售部"},{"deptId":"D019101","deptName":"华北销售中心"}],[{"deptId":"D083","deptName":"音乐事业部"}],[{"deptId":"D027","deptName":"杭州研究院"},{"deptId":"D027048","deptName":"技术工程事业部"},{"deptId":"D027048002","deptName":"项目管理与效能中心"}],[{"deptId":"D027","deptName":"杭州研究院"},{"deptId":"D027048","deptName":"技术工程事业部"}],[{"deptId":"D027","deptName":"杭州研究院"},{"deptId":"D027048","deptName":"技术工程事业部"}]]';
    const arr = JSON.parse(str).flat(); //扁平化

    let newArr = [];
    noRepeat(arr).length && noRepeat(arr).forEach(it => {
      appendChild(it, newArr);
    });
  }, [])

  const noRepeat = (arr) => { //去重
    let newobj = {}; 
    return arr.reduce((preVal, curVal) => {
    newobj[curVal.deptId] ? '' : newobj[curVal.deptId] = preVal.push(curVal); 
      return preVal 
    }, []);
  }

  const appendChild = (item, newArr) => {
    if(!newArr.find(it => item.deptId.indexOf(it.deptId) > -1)) { //所有一级部门
      newArr.push({
        deptId: item.deptId,
        deptName: item.deptName,
        children: [],
      });
      setTreeData(newArr);
    }else {
      appendOtherChild(item, newArr);
    }
  }

  const appendOtherChild = (item, newArr) => {
    newArr.map(it => {
      if(item.deptId.indexOf(it.deptId) > -1 && item.deptId.length === it.deptId.length+3) {
        it.children.push({
          deptId: item.deptId,
          deptName: item.deptName,
          children: [],
        })
      }else {
        appendOtherChild(item, it.children);
      }
    });
    setTreeData(newArr);
  }

总结

可能这些数据和你的不太一样,但是逻辑可能八九不离十,可以好好看一下这几十行代码

到此这篇关于如何将JavaScript将数组转为树形结构的文章就介绍到这了,更多相关JavaScript数组转为树形结构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Jquery数独游戏解析(一)-页面布局
Nov 05 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
Dec 28 Javascript
通过jquery 获取URL参数并进行转码
Aug 18 Javascript
JavaScript学习笔记之DOM基础 2.4
Aug 14 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
Jan 06 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
jQuery Form表单取值的方法
Jan 11 Javascript
微信小程序 navbar实例详解
May 11 Javascript
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
JavaScript正则表达式和级联效果
Sep 14 Javascript
浅析JS中什么是自定义react数据验证组件
Oct 19 Javascript
javascript实现计算器功能详解流程
Nov 01 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python对Excel的读取的示例代码
2020/02/14 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
pandas分组聚合详解
2020/04/10 Python
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
军训自我鉴定100字
2014/02/13 职场文书
借款担保书范文
2014/05/13 职场文书
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL