如何将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学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
JavaScript入门之事件、cookie、定时等
Oct 21 Javascript
js中apply方法的使用详细解析
Nov 04 Javascript
js每隔5分钟执行一次ajax请求的实现方法
Nov 27 Javascript
关于Javascript作用域链的八点总结
Dec 06 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
Jul 25 Javascript
jQuery初级教程之网站品牌列表效果
Aug 02 jQuery
微信小程序tabBar模板用法实例分析【附demo源码下载】
Nov 28 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
Aug 29 Javascript
解决layui 表单元素radio不显示渲染的问题
Sep 04 Javascript
微信小程序单选框自定义赋值
May 26 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
咖啡因含量是由谁决定的?低因咖啡怎么来?低因咖啡适合什么人喝
2021/03/06 新手入门
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
jQuery实现滚动效果
2017/11/17 jQuery
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
angular 服务随记小结
2019/05/06 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
对python读取CT医学图像的实例详解
2019/01/24 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python aiohttp的使用详解
2019/06/20 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
应届毕业生如何写求职信
2014/02/16 职场文书
体现团队精神的口号
2014/06/06 职场文书
国庆庆典邀请函
2015/02/02 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
《植树问题》教学反思
2016/03/03 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
MySQL数据库完全卸载的方法
2022/03/03 MySQL
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏