如何将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 相关文章推荐
jQuery Ajax 全解析
Feb 08 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
Nov 19 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
Mar 05 Javascript
jQuery子窗体取得父窗体元素的方法
May 11 Javascript
微信小程序开发教程之增加mixin扩展
Aug 09 Javascript
layui实现数据分页功能(ajax异步)
Jul 27 Javascript
js中比较两个对象是否相同的方法示例
Sep 02 Javascript
QML实现圆环颜色选择器
Sep 25 Javascript
Vue SPA 初次进入加载动画实现代码
Nov 14 Javascript
js中实现继承的五种方法
Jan 25 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
低门槛开发iOS、Android、小程序应用的前端框架详解
Oct 16 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
php学习笔记之 函数声明(二)
2011/06/09 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Python中的rjust()方法使用详解
2015/05/19 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
乡镇爱国卫生月活动总结
2014/06/25 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
干部培训工作总结2015
2015/05/25 职场文书
2015年个人实习工作总结
2015/05/28 职场文书
初三化学教学反思
2016/02/22 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫