如何将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 相关文章推荐
在textarea中显示html页面的javascript代码
Apr 20 Javascript
Jquery 弹出层插件实现代码
Oct 24 Javascript
Javascript面向对象编程
Mar 18 Javascript
javascript中声明函数的方法及调用函数的返回值
Jul 22 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 Javascript
jQuery对象与DOM对象之间的相互转换
Mar 03 Javascript
js实现精确到毫秒的倒计时效果
Aug 05 Javascript
JS实现双击内容变为可编辑状态
Mar 03 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
Jun 23 Javascript
JavaScript面向对象中接口实现方法详解
Jul 24 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
Nov 02 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
windows xp下安装pear
2006/12/02 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
带你了解python装饰器
2017/06/15 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
python 错误处理 assert详解
2020/04/20 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
大二学生职业生涯规划书
2014/02/05 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
会计工作态度自我评价
2015/03/06 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
python正则表达式re.search()的基本使用教程
2021/05/21 Python
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android