范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

js中平级数组和树形结构数据相互转换

  在实际的工作和业务需求中,我们经常会碰到树形数据结构,比如公司组织架构、组织层级、省市县或者事物的分类等等数据。那么在JavaScript中如何将数组转为树形结构和树形结构转为数组,本文就详细的来探究一下。
  先来看看给出了一组怎样的数据,转换为怎样的树形结构。
  后台接口返回或者面试官给你的数据:const list = [   {id: 1, name: "部门1", pid: 0},   {id: 2, name: "部门1-1", pid: 1},   {id: 3, name: "部门1-2", pid: 1},   {id: 4, name: "部门1-1-1", pid: 2},   {id: 5, name: "部门1-2-1", pid: 3},   {id: 6, name: "部门2", pid: 0},   {id: 7, name: "部门2-1", pid: 6},   {id: 8, name: "部门3", pid: 0}, ]
  期望的处理后的数据:const listTree = [   {     id: 1,     name: "部门1",     pid: 0,     children: [       {         id: 2,         name: "部门1-1",         pid: 1,         children: [           {             id: 4,              name: "部门1-1-1",              pid: 2,             children: []           }         ]       },       {         id: 3,         name: "部门1-2",         pid: 1,         children: [           {             id: 5,              name: "部门1-2-1",              pid: 3,             children: []           }         ]       }     ]   },   {     id: 6,     name: "部门2",     pid: 0,     children: [       {         id: 7,          name: "部门2-1",          pid: 6,         children: []       }     ]   },   {     id: 8,     name: "部门3",     pid: 0,     children: []   } ]
  一、数组转换为树形结构
  如果后台给了一个这样的数据说让前端自己去转换为树形结构或者面试官给你一组这样的数据让你手写一个转换方法,你会怎么处理?
  1、递归实现// 递归查找获取子节点 const getChild = (list, result, pid) => {   for(const item of list) {     if(item.pid === pid) {       const newItem = { ...item, children: [] };       result.push(newItem);       getChild(list, newItem.children, item.id);     }   } } // 调用递归实现 const listToTree = (list, pid) => {   const result = [];   getChild(list, result, pid);   return result; } listToTree(list, 0)
  2、Map对象实现const listToTree = (list) => {   // 最终树形结构输出的结果   const result = [];   const itemMap = {};   for(const item of list) {     const id = item.id;     const pid = item.pid;     if(!itemMap[id]) {       itemMap[id] = {         children: [],       };     }     itemMap[id] = {       ...item,       children: itemMap[id]["children"],     };     const treeItem = itemMap[id];     if(pid === 0) {       result.push(treeItem)     } else {       if(!itemMap[pid]) {         itemMap[pid] = {           children: []         }       }       itemMap[pid].children.push(treeItem);     }   }   return result; }  listToTree(list, 0)
  3、filter实现
  这种方法很有意思,可能大多数人想不到,也是从大佬处学到的(读书人的是怎么能叫抄呢,应该叫"窃")。const listToTree = (list, key) => {   const tree = list.filter(function(parent) {     // 返回每一项得的子级数据     const branchArr = list.filter((child) => parent.id === child[key]);     parent.children = [];     // 如果存在子级,则给父级添加一个children属性并赋值     if (branchArr.length > 0) {       parent.children = branchArr;     }     // 返回第一层     return parent[key] == 0;   });   return tree; } // 传入原始数据和父级pid的key listToTree(list, "pid")
  二、树形结构转换为数组
  1、reduce取树行数据的所有子集function treeTransList(tree, key) {   return tree.reduce(function(con, item) {     var callee = arguments.callee;     con.push(item);     if (item[key] && item[key].length >0)       item[key].reduce(callee, con);     return con;   }, []).map(function(item){     item[key] = [];     return item;   }) } treeTransList(listTree, "children")
  2、递归实现function getItem(tree, result) {   for (let i = 0; i < tree.length; i++) {     if(tree[i].children) {       getItem(tree[i].children, result)       delete tree[i].children;     }     result.push(tree[i])   }   return result; }  function treeToList(tree) {   const result = [];   getItem(tree, result);   return result; } treeToList(listTree)
  3、广度优先遍历法function treeToList(tree, childName = "children") {   // 设置临时数组,用来存放队列   let queen = [];   // 设置输出数组,用来存放要输出的一维数组   const result = [];   queen = queen.concat(tree);   // 对树对象进行广度优先的遍历   while(queen.length) {     const first = queen.shift();     if (first[childName]) {       queen = queen.concat(first[childName]);       delete first[childName]     }     result.push(first);   }   return result; }   treeToList(listTree, "children")

每次10分钟跟我学Python(第九十一次课)大家好!我是幻化意识流,今天继续跟我学Python。这两天偶尔会发呆,敏感的朋友一定知道我在想什么?没错,我在想钱,money,cash。看着头条上我的收益,连一碗泡面都买不起,有每次10分钟跟我学Python(第八十次课)大家好!我是幻化意识流,今天继续跟我学Python。接上节课,我们继续做练习我们先准备材料字符串(随便输入点什么都行)这是我不由自主地想起了桃花源记陶渊明东晋晋太元中武陵人捕鱼为业每次10分钟跟我学Python(第八十六次课)大家好!我是幻化意识流,今天继续跟我学Python。上次课的问题,您猜到是什么了吗?我想,有的同学一定是猜到了,就是说,我们在增加一条记录的时候,并不是每次都要在以前记录的末尾添加助眠小帮手南卡Zzzz枕中宝骨传导音箱哈喽大家好,我是你们的校长!今天给各位介绍的是这款南卡的骨传导蓝牙音箱南卡Zzzz!在日常生活中,辛苦劳动了一天,晚上都会早早地躺下呼呼大睡,但难免会出现失眠的情况,很不巧,我就是年轻人的二次元HIFI首选!IKKOOH1S全新升级哈喽大家好我是你们的校长!那么今天给大家评测的呢,是这款来自IKKO的新品耳机IKKOOH1S!同时还有升级线CTU01以及转接器ITM01对于IKKO这个品牌呢,相信各位在我这里你的善良,应该带点锋芒。这个世界就是有的人,尽捡软柿子捏。你的善良,应该带点锋芒。这个世界就是有的人,尽捡软柿子捏。你越处处忍让,处处为别人着想,处处担待,别人越骑到你头上来。因为你没有把你的需求表现出来,即使表现出来了,也是一副渴求别人win10电脑中右击文件没有以管理员身份运行选项怎么办Windows10系统正常在右键选择运行某个程序的时候,会有以管理员身份运行的选项,如下图所示如果在win10右键菜单中发现缺少了以管理员身份运行的选项,可以尝试按照下面的方法来恢2021年度编程ampampamp机器人赛事日程汇总升学竞赛科创教育热门赛事简介01hr蓝桥杯青少儿赛蓝桥杯大赛是工信部人才交流中心举办的全国性专业信息技术赛事。蓝桥杯大赛塑造了领跑全国的人才培养选拔模式,并获得了行业的深度认可。STEAM评测包含3种使用机器人的创新方式机器人可以帮助你年迈的父母,教育你的孩子,为你做饭。自成立以来,机器人行业的收入增长迅猛。20182023年,全球机器人市场的复合年增长率预计将达到24。52。意识到机器人的不可思人工智能视频分析可以增强运营的四种方式1921年在堪萨斯州的威奇托,我们所知道的食品消费和餐厅体验的转变开始了美国第一家快餐汉堡店白色城堡盛大开业。WhiteCastle专注于快速廉价的食品,需要一种新的流水线生产方式值得关注的5大数据可视化新兴趋势数据可视化是了解业务指标的最新方法随着信息世界技术的进步,数据可视化正成为每个企业和组织都应该掌握的一项重要技能。数据可视化在理解并将其转换为理解业务指标洞察力的最佳方式方面发挥着
胜利油田车管中心165辆新能源车年节约成本280万元新能源车大大减少了燃料费用。对比2021年8月至2022年2月期间燃油车与新能源车的运行数据可以发现,新能源车辆运营近一年来,为胜利油田油田节省各项成本280万元。同时,新能源车维港股异动东吴水泥(00695。HK)涨超12订立有关发展新能源商用车的投资框架协议东吴水泥(00695。HK)公布,于2022年4月25日,该公司四川涪创发展集团有限公司(涪创发展)苏州同捷汽车工程技术股份有限公司(苏州同捷)及中国重汽集团绵阳专用汽车有限公司(曾经屠龙的平板电脑,已经沦为昂贵的电子垃圾由于线上教育的兴起,平板电脑成为这两年热门的消费电子产品,然而柏铭科技数数目前热销的平板电脑,却发现这些平板电脑已沦为昂贵的电子垃圾,与笔记本电脑已经完全无法比。当前定位较为实惠的新能源汽车小电瓶没电了电子锁会打开吗新能源汽车小电瓶没电了电子锁会打开。电控锁的电力来源是蓄电池。不过,蓄电池没有电的情况下,电控锁失电,但是却可以通过手动将已经锁止的门把手旁边的一个手动控制锁扳开,这样再扳动扳把就中国工程院院地合作项目甘肃新能源产业协同发展路径研究启动强科技行动日前,中国工程院院地合作项目中国工程科技发展战略甘肃研究院(简称甘肃研究院)2021年度重大战略研究与咨询项目碳达峰碳中和背景下甘肃新能源产业协同发展路径研究启动。该项目(经济)我国已有超3000个高速公路服务区建充换电基础设施新华社北京4月26日电(记者叶昊鸣)驾驶新能源车出行离不开充换电基础设施。交通运输部公路局副局长周荣峰26日说,目前全国已有3102个高速公路服务区建设了充换电基础设施,共建成充电众安保险升级实时数仓技术支持保险业务流式大数据分析黄一灵中国证券报中证网中证网讯(记者黄一灵)近日,众安保险数据中台(集智平台)正式升级实时数仓技术。该平台支持保险业务流式大数据分析和最高十亿级数据量,预计整体分析性能比过去提升3消费者报告新车交付一再延迟,哪吒汽车本月已安排第二批生产计划记者程悦编辑去年双十一,陈幸在天猫下单了哪吒汽车VPro智享版新能源车,销售人员跟他说预计十二月底交车,然而直到春节,他都没有收到任何提车信息。节后,销售问他是否愿意换些配置,如果零跑汽车发布无电池包CTC技术中证网讯(记者金一丹)4月25日,据零跑汽车消息,智能时代源力觉醒零跑智能动力CTC电池底盘一体化技术发布会(简称零跑智能动力CTC技术)在线上开启。零跑科技董事长朱江明宣布,将对紧急避让,探测距离300米,日产发布道路实况感知技术当前方有车要倒车,这时后方车辆选择换道避让,当下一幕突然有人在路边出现,车辆选择了紧急制动。4月25日,这样看起来更符合人类司机的驾驶行为出现在了日产汽车全全自动驾驶技术说明会上的国内国际最新科技动态2022。4。25星期一国内科技动态1。陕西太白发现野生扇脉杓兰秦岭野生扇脉杓兰植株一2。用机器学习揭示全球中大地震破裂模式3。雅鲁藏布江流域多圈层水文监测网建成4。科研人员全合成结构独特的环状海星皂甙5