如何将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 相关文章推荐
js数组Array sort方法使用深入分析
Feb 21 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
Jan 28 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
基于gulp合并压缩Seajs模块的方式说明
Jun 14 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
Feb 09 Javascript
js插件实现图片滑动验证码
Sep 29 Javascript
layui点击按钮添加可编辑的一行方法
Aug 15 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 Javascript
用JS实现飞机大战小游戏
Jun 09 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
神族 Protoss 历史背景
2020/03/14 星际争霸
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
Javascript之String对象详解
2016/06/08 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
vue 登录滑动验证实现代码
2018/08/24 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
C#软件工程师英语面试题
2015/06/07 面试题
生物科学专业个人求职信范文
2013/12/07 职场文书
上学迟到的检讨书
2014/01/11 职场文书
监察建议书格式
2014/05/19 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
高中化学教学反思
2016/02/22 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android