如何将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 相关文章推荐
兼容Mozilla必须知道的知识。
Jan 09 Javascript
学习ExtJS TextField常用方法
Oct 07 Javascript
javascript设计模式之解释器模式详解
Jun 05 Javascript
JS版元素周期表实现方法
Aug 05 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
js实现密码强度检验
Jan 15 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
Aug 14 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
vue webpack实用技巧总结
Apr 24 Javascript
Webpack中publicPath路径问题详解
May 03 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
Aug 14 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
php define的第二个参数使用方法
2013/11/04 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
详解Python验证码识别
2016/01/25 Python
打包发布Python模块的方法详解
2016/09/18 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
python 读取数据库并绘图的实例
2019/12/03 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
大学生秋游活动方案
2014/02/17 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
医师定期考核实施方案
2014/05/07 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
教师个人学习总结
2015/02/11 职场文书
酒店员工管理制度
2015/08/05 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android