如何将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 相关文章推荐
帮助避免错误的Javascript陷阱清单
May 31 Javascript
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
js实现翻页后保持checkbox选中状态的实现方法
Nov 03 Javascript
jquery的ajax简单结构示例代码
Feb 17 Javascript
jquery easyui中treegrid用法的简单实例
Feb 18 Javascript
三种方式获取XMLHttpRequest对象
Apr 21 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
Nov 27 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
vue百度地图 + 定位的详解
May 13 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
浅析PHP中Collection 类的设计
2013/06/21 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python生成随机MAC地址
2015/03/10 Python
Python的re模块正则表达式操作
2016/05/25 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
工程质量月活动方案
2014/02/19 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
2016公司年会主持词
2015/07/01 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python