如何将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 相关文章推荐
新页面打开实际尺寸的图片
Aug 25 Javascript
JavaScript EasyPager 分页函数
May 25 Javascript
eval的两组性能测试数据
Aug 17 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
Nov 17 Javascript
jQuery学习笔记之入门
Dec 14 Javascript
详解jQuery的表单验证插件--Validation
Dec 21 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
angular分页指令操作
Jan 09 Javascript
angular中如何绑定iframe中src的方法
Feb 01 Javascript
express中static中间件的具体使用方法
Oct 17 Javascript
JavaScript创建表格的方法
Apr 13 Javascript
关于antd tree 和父子组件之间的传值问题(react 总结)
使用react+redux实现计数器功能及遇到问题
微信小程序基础教程之echart的使用
vue实现水波涟漪效果的点击反馈指令
vue 实现上传组件
May 31 #Vue.js
vue基于Teleport实现Modal组件
Vue+Element UI实现概要小弹窗的全过程
You might like
php可生成缩略图的文件上传类实例
2014/12/17 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
json跨域调用python的方法详解
2017/01/11 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
python dlib人脸识别代码实例
2019/04/04 Python
python实现支付宝转账接口
2019/05/07 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Python实现搜索算法的实例代码
2020/01/02 Python
django 取消csrf限制的实例
2020/03/13 Python
python 一维二维插值实例
2020/04/22 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
中科方德软件测试面试题
2016/04/21 面试题
就业协议书的作用
2014/04/11 职场文书
教研活动总结
2014/04/28 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
大班上学期个人总结
2015/02/13 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL