最新要闻
- 热文:华硕全球首秀四频段Wi-Fi 7路由器:峰值下载2.5万兆
- 滚动:惠普新款EliteBook 1040笔记本发布:13代酷睿、2K 120Hz屏
- 天天视点!为什么一个病毒株传着传着就没了?
- Redmi K40S 12+256G顶配版不到1900元:骁龙870和OIS都有
- 各大新能源车企年度KPI出炉 特斯拉未达标 比亚迪称王
- 每日时讯!酷安最火骁龙8系手机诞生!一加11酷安热度第一
- 时隔两年 国美真快乐App重新更名国美
- 焦点要闻:加油被惊喜到!一加11不杀后台:前一天打开的APP第二天还在
- 温子仁恐怖片新作《梅根》 拯救了北美院线一月票房
- 天天热点评!被假货逼疯的劳力士:终于坐不住了
- 全球快资讯:要的就是销量!特斯拉在新加坡优惠近7万
- 全球新资讯:豆瓣9.5高分动画!有家长炮轰《中国奇谭》画风吓哭孩子 网友不乐意了
- 加了国六B汽油 排气管喷水?网友犀利吐槽:我加了拉肚子
- 热讯:峰米S5 Rolling投影仪发布:360度可旋转支架 还能当音箱用
- 世界热推荐:米哈游创始人之一参与打造:国产独立游戏《微光之镜》今日发售
- 即时看!奥迪RS e-tron GT很好 但它仍是大众体系里最拧巴的产品
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球报道:JavaScript 扁平与树形数组数据的转换
在 JavaScript 中,可以使用递归算法将扁平的数据转换为树形结构。
扁平数据通常是一个带有 parentId 属性的数组,而树形结构通常是一个带有 children 属性的对象。
(资料图片)
1、方法一
下面是一个简单的例子,它演示了如何将扁平数组转换为树形对象:
let data = [ { id: 1, pid: 0, name: "沃尔玛" }, { id: 2, pid: 0, name: "生鲜区" }, { id: 3, pid: 1, name: "日用品区" }, { id: 4, pid: 2, name: "鱼" }, { id: 5, pid: 2, name: "牛肉" }, { id: 6, pid: 13, name: "卫生纸" }, { id: 7, pid: 3, name: "牙刷" }, { id: 8, pid: 7, name: "电动牙刷" }, { id: 9, pid: 7, name: "普通牙刷" }];function convertToTree(flatData) { let treeData = []; let map = new Map(); let outputObj, pid; for (let i = 0; i < flatData.length; i++) { pid = flatData[i].pid; if (map.has(pid)) { if (!map.get(pid).childrens) map.get(pid).childrens = []; let obj = new Object(flatData[i]); map.get(pid).childrens.push(obj); map.set(flatData[i].id, obj); } else if (!map.has(pid) && pid == 0) { outputObj = new Object(flatData[i]); treeData.push(outputObj); map.set(flatData[i].id, outputObj); } } return treeData;}let TreeData = convertToTree(data);console.log(TreeData);
2、方法二
使用递归算法将扁平数组转换为树形对象:
const flatData = [ { id: 1, name: "Node 1", parentId: null }, { id: 2, name: "Node 2", parentId: 1 }, { id: 3, name: "Node 3", parentId: 2 }, { id: 4, name: "Node 4", parentId: 3 }, { id: 5, name: "Node 5", parentId: 3 }];function convertToTree(flatData, parentId = null) { const children = flatData.filter(node => node.parentId === parentId); if (!children.length) { return null; } return children.map(node => ({ ...node, children: convertToTree(flatData, node.id) }));}const treeData = convertToTree(flatData);console.log(treeData);
该算法的流程为:
- 使用 filter() 函数过滤出所有的子节点。
- 使用 map() 函数构造每个子节点的新结构,并使用递归来处理子节点的 children 属性。
3、方法三
还有一些第三方库可以帮助你转换扁平数据为树形结构,例如 lodash
中的 _.groupBy()
和 _.mapValues()
方法可以帮助你将扁平数据转换为树形数据。
const flatData = [ { id: 1, name: "Node 1", parentId: null }, { id: 2, name: "Node 2", parentId: null }, { id: 3, name: "Node 3", parentId: 1 }, { id: 4, name: "Node 4", parentId: 2 }, { id: 5, name: "Node 5", parentId: 2 }];const tree = _(flatData) .groupBy("parentId") .mapValues((children, parentId) => ({ id: parentId || "root", children: children.map(({ id, name, parentId }) => ({ id, name, parentId })) })) .values() .value();console.log(tree)
在这种情况下,假设parentId为null的数据项是根节点,那么所有其它的数据项的 parentId 分别对应它的父节点,我们可以使用 groupBy()
来将所有节点根据它们的 parentId 分组,然后我们可以使用 mapValues()
来构造每个组的新结构。
4、方法四
const flatData = [ { id: 1, name: "Node 1", value: 1, parentId: null }, { id: 2, name: "Node 2", value: 2, parentId: 1 }, { id: 3, name: "Node 3", value: 3, parentId: 2 }, { id: 4, name: "Node 4", value: 4, parentId: 3 }, { id: 5, name: "Node 5", value: 5, parentId: 3 }];/** * 将扁平数组转换为树形对象, * 适用于来自同一个表的数据,即idName的数据不重复 * * @param {*} flatData 同级数组数据 * @param {*} idName 唯一id * @param {*} pidName 父级id * @param {*} nameName 自定义(Cascader 级联选择器)键名称 * @param {*} valueName 自定义(Cascader 级联选择器)值名称 * @returns 树形结构数组数据,适用于Cascader 级联选择器组件 */function convertToTree(flatData, idName, pidName, nameName, valueName) { let treeData = []; if (!Array.isArray(flatData)) { return treeData; } flatData.forEach((item) => { delete item.children; }); let map = {}; flatData.forEach((item) => { // 深拷贝,该方式将使该转换方法失效 // map[item[idName]] = JSON.parse(JSON.stringify(item)); // 浅拷贝,将对 item 的引用传递给 map map[item[idName]] = item; }); flatData.forEach((item) => { // 深拷贝,该方式将使该转换方法失效 // let parent = JSON.parse(JSON.stringify(map[item[pidName]])); // 浅拷贝,将对 map 的引用传递给 parent let parent = map[item[pidName]]; if (parent) { // 利用了浅拷贝的引用传递,最终 flatData 中的 item 将会改变 (parent.children || (parent.children = [])).push( nameName && valueName ? Object.assign(item, { label: item[nameName], id: item[valueName] }) : item); } else { treeData.push( nameName && valueName ? Object.assign(item, { label: item[nameName], id: item[valueName] }) : item); } }); return treeData;}const treeData = convertToTree(flatData, "id", "parentId", "name", "value");console.log(treeData);
二、树形转扁平
1、方法一
在 JavaScript 中,可以使用递归算法将树形结构数据转换为扁平数组。
下面是一个简单的例子,它演示了如何将树形数据转换为扁平数组:
const treeData = [{ id: 1, name: "Node 1", children: [ { id: 2, name: "Node 2", children: [{ id: 3, name: "Node 3" }, { id: 4, name: "Node 4" }] }, { id: 5, name: "Node 5" } ]}];function convertToFlat(data, parentId = null) { return data.reduce((acc, curr) => { acc.push({ ...curr, parentId }); if (curr.children) { acc = acc.concat(convertToFlat(curr.children, curr.id)); } return acc; }, []);}const flatData = convertToFlat(treeData);console.log(flatData);
该算法的流程为:
- 使用 reduce() 函数遍历每个节点,并将父节点的 id 作为参数传递给递归函数。
- 使用 push() 函数将当前节点添加到结果数组中。
- 使用 concat() 函数将递归调用的结果与结果数组连接在一起。
- 如果当前节点有 children 属性,则递归调用 convertToFlat() 函数,并将当前节点的 id 作为父节点传递给函数。
注意:该方法返回的扁平结构数据未将 children属性删除,因此存在冗余的数据。
这是一种将树形结构数据转换为扁平数组的方法,如果有其他特定的需求,还可以使用其他方法来转换数据,例如使用广度优先遍历算法,使用队列存储节点。
2、方法二
const treeData = [ { id: 1, name: "Node 1", children: [ { id: 2, name: "Node 2", children: [ { id: 3, name: "Node 3" }, { id: 4, name: "Node 4" }, ] }, { id: 5, name: "Node 5" }, ] }, { id: 6, name: "Node 6", children: [ { id: 7, name: "Node 7" } ] },];function convertToFlat(treeData, parentId = null) { let flatData = []; for (let node of treeData) { flatData.push({ id: node.id, name: node.name, parentId }); if (node.children) { flatData = flatData.concat(convertToFlat(node.children, node.id)); } } return flatData;}const flatData = convertToFlat(treeData);console.log(flatData);
该算法的流程为:- 创建一个空的扁平数组。- 递归遍历树形数组中的每个节点,将当前节点添加到扁平数组中。- 对于当前节点的子节点,继续使用递归,并将子节点添加到扁平数组中。- 返回扁平数组注意:该方法需要手动构造push 到扁平数组的对象,通用性较差。3、方法三
在 JavaScript 中,可以使用递归算法将树形结构数据转换为扁平数组。
下面是一个简单的例子,它演示了如何将树形数据转换为扁平数组:
let data = [{ id: 1, pid: 0, name: "沃尔玛", childrens: [ { id: 2, pid: 1, name: "生鲜区", childrens: [ { id: 4, pid: 2, name: "鱼" }, { id: 5, pid: 2, name: "牛肉" } ] }, { id: 3, pid: 1, name: "日用品区", childrens: [ { id: 6, pid: 3, name: "卫生纸" }, { id: 7, pid: 3, name: "牙刷" } ] } ]}];function convertToFlat(treeData) { let flatData = []; for (let i = 0; i < treeData.length; i++) { if (treeData[i].childrens) { flatData.push(...convertToFlat(treeData[i].childrens)); delete treeData[i].childrens; } flatData.push({ ...treeData[i] }); } return flatData;}let flatData = convertToFlat(data);console.log(flatData);
该方法通用性较强,对树形结构数组数据内部具体的属性名 要求较小(除 childrens)。
全球报道:JavaScript 扁平与树形数组数据的转换
热点在线丨层叠样式表(CSS)1
当前最新:ceph-3
世界速读:区块链特辑——solidity语言基础(四)
热文:华硕全球首秀四频段Wi-Fi 7路由器:峰值下载2.5万兆
滚动:惠普新款EliteBook 1040笔记本发布:13代酷睿、2K 120Hz屏
天天视点!为什么一个病毒株传着传着就没了?
Redmi K40S 12+256G顶配版不到1900元:骁龙870和OIS都有
各大新能源车企年度KPI出炉 特斯拉未达标 比亚迪称王
焦点速读:区块链特辑——solidity语言基础(二)
每日时讯!酷安最火骁龙8系手机诞生!一加11酷安热度第一
时隔两年 国美真快乐App重新更名国美
快看点丨大前端html学习06-宽高自适应
天天观察:SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
Redis的客户端
每日时讯!关于19c RU补丁报错问题的分析处理
环球简讯:记录使用adb连接rn项目进行开发
焦点要闻:加油被惊喜到!一加11不杀后台:前一天打开的APP第二天还在
最新快讯!Python中高阶函数与装饰器教程
【新要闻】Python中的异常处理总结
flutter 效果实现 —— 全面屏效果
Mysql中的锁:表、MDL、意向锁、行锁
温子仁恐怖片新作《梅根》 拯救了北美院线一月票房
天天热点评!被假货逼疯的劳力士:终于坐不住了
全球快资讯:要的就是销量!特斯拉在新加坡优惠近7万
全球新资讯:豆瓣9.5高分动画!有家长炮轰《中国奇谭》画风吓哭孩子 网友不乐意了
全球今日报丨【首页】热销爆品开发修改商品值
加了国六B汽油 排气管喷水?网友犀利吐槽:我加了拉肚子
热讯:峰米S5 Rolling投影仪发布:360度可旋转支架 还能当音箱用
世界热推荐:米哈游创始人之一参与打造:国产独立游戏《微光之镜》今日发售
即时看!奥迪RS e-tron GT很好 但它仍是大众体系里最拧巴的产品
当前讯息:菜鸟将投2亿:补贴快递员爬楼送货上门
天天快看:iOS 16卡壳了
世界热推荐:OLED+彩色水墨翻转双屏!联想公布ThinkBook Plus Twist笔记本
天天微速讯:雷军爆料了!新机皇小米13 Ultra或将于MWC发布:影像堆料突破天际
焦点速看:因易增加儿童哮喘几率:美国或将禁止使用燃气灶
【环球播资讯】曾狠坑过乐视!中电熊猫被拉横幅维权:“还我血汗钱”
快消息!事件处理_2事件修饰符
flutter 基础 —— 事件监听
环球热门:JavaScript 将base64 转换为File
当前信息:129元 荣耀智能体脂秤3开售:Wi-Fi、蓝牙双连接
买699元手机送99元耳机!Redmi 12C价格跟米粉交个朋友
今晚20点抢京东大额红包 天猫年货节红包最后一天
每日动态!没了量子力学 你连手机都玩不了
焦点热讯:9.78万起 飞度堂弟新款东风本田来福酱上市:动力被砍、油耗不变
热门看点:Bonitasoft认证绕过和RCE漏洞分析及复现(CVE-2022-25237)
【世界快播报】操作系统 — 精髓与设计原理(第二章 操作系统概述)
速看:2023年手机还能怎样进化?三点方向
全球热议:干不过BBA!广汽讴歌退出中国市场:车型少 价格高
俄罗斯影院播放盗版《阿凡达2》:还是合法的!西方干瞪眼
【环球新视野】巴黎圣母院确认2024年重开!《刺客信条》花费2年还原
今日关注:接盘国服暴雪玩家!网易《无尽战区》明天开服 配置要求公布
每日热门:部分聚类算法简介及优缺点分析
时讯:记录--JS-SDK页面打开提示realAuthUrl错误
最新:5. 使用互斥量保护共享数据
环球新消息丨【Python爬虫实战项目】Python爬虫批量下载相亲网站数据并保存本地(附源码)
天天快看:什么是堆叠面积图?
热点在线丨老车主维权、新客户下单!特斯拉大降价后3天获3万辆订单
每日快讯!李斌:我们从来不把自己称作豪华品牌
当前观察:百度CreateAI开发者大会:李彦宏称2027前一线城市不再需要限购限行
当前热文:炒币亏了3个亿的美图满血复活了:全体员工发股票 搬入新大楼
过年微醺 RIO鸡尾酒大促!56元到手10瓶
软件开发入门教程网之MySQL NULL 值处理
环球关注:【首页】商品列表和单个商品组件封装
焦点报道:曝iPhone 15开始试产:采用国产灵动岛屏 京东方供货
天天看热讯:李想:理想L7小订最大用户群来自特斯拉车主
中国新能源汽车补贴13年:投入超1500亿元 覆盖317万辆车
13种Shell逻辑与算术,能写出5种算你赢!
提升代码可读性,减少if-else的几个小技巧
天天快看:携程梁建章建议:取消中考 缩短中小学学制 提前2年上班
时代变了!日系豪华败走中国:停产停售、官网504、全面退场
焦点速看:DOS初识
【天天播资讯】《春晚》收视率史低 2023年很多节目真实生活取材 这次必看
全球报道:干掉致命疾病!全球首款蜜蜂疫苗获批
转子发动机回归!马自达官宣:增程式版MX-30本月发布
环球速读:解决安卓四大不可能 李杰:一加11 16GB流畅用四年
环球快资讯:再也不怕侧方停车!现代展示e-Corner系统:还能“坦克掉头”
ElasticSearch必知必会-基础篇
环球快报:火山引擎 DataLeap 通过中国信通院测评,数据管理能力获官方认可!
全球速递!开源动物行为分析实验箱(斯金纳箱)需求调研分析
世界看点:低代码开发:释放数字化生产力
文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具
百事通!成了!微信:视频号用户总使用时长接近朋友圈80%
天天要闻:开袋即食 一口弹牙 大牌优形肉肠0.99元/根(商超2.5元)
快资讯:期待!《生化危机4:重制版》威斯克或将登场
特斯拉门店:降价维权后销量翻倍!全国一天提车量超1万台
2023支付宝集五福最全攻略 神秘玩法千万别错过
琥珀银杏果是什么东西?琥珀银杏果是什么地方的菜?
兵长一米六是什么意思?兵长一米六顺口溜
美髯公指的是谁?美髯公是什么意思?
金坷垃是什么意思?金坷垃是什么时候的梗?
肥皂水是碱性还是酸性?肥皂水的主要化学成分是什么?
主角叫萧破天的小说有哪些?主角叫萧破天的全部小说
转世仁波切是什么意思?转世仁波切怎么认证?
电信拨打长途前面加什么?电信拨打长途要钱吗?
今日最新!金子塔图,自定义图表,伪漏斗图
环球今日报丨Codeforces 1704 F Colouring Game 题解 (结论,SG函数)
dnf武极觉醒技能怎么点?DNF武极觉醒技能介绍
倒角外倒角内倒角怎么区分?倒角外倒角内倒角的区别有哪些?
申怡走进云南白沙湾小学开讲公益语文课 用语文点亮希望的灯火