如何将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中的array数组使用技巧
Jan 31 Javascript
jquery 应用代码 方便的排序功能
Feb 06 Javascript
jQuery 隐藏和显示 input 默认值示例
Jun 03 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
js点击任意区域弹出层消失实现代码
Dec 27 Javascript
JavaScript实现经典排序算法之插入排序
Dec 28 Javascript
浅析JavaScript中var that=this
Feb 17 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
详解iview的checkbox多选框全选时校验问题
Jun 10 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP微信红包API接口
2015/12/05 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
详解原生JS动态添加和删除类
2019/03/26 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
详解Python中的序列化与反序列化的使用
2015/06/30 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python操作MongoDB详解及实例
2017/05/18 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Python处理session的方法整理
2019/08/29 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
python 实现表情识别
2020/11/21 Python
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
优秀小学生家长评语
2014/01/30 职场文书
初中学习计划书范文
2014/09/15 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
怎么写工作检讨书
2014/11/16 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
开工典礼致辞
2015/07/29 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python