当前位置: 首页 > news >正文

前端小技巧: TS实现数组转树,树转数组

将数组转为树

interface IArrayItem {id: number,name: string,parentId: number
}interface ITreeNode {id: numbername: stringchildren?: ITreeNode[]
}const arr = [{id: 1, name: '部门A', parentId: 0},{id: 2, name: '部门B', parentId: 1},{id: 3, name: '部门C', parentId: 1},{id: 4, name: '部门D', parentId: 2},{id: 5, name: '部门E', parentId: 2},{id: 6, name: '部门F', parentId: 3}
]function convert(arr: IArrayItem[]): ITreeItem | null {// 用于id和treeNode的映射关系表const idToTreeNode: Map<number, ITreeNode> = new Map()let root = nullarr.forEach(item => {const {id, name, parentId} = itemconst treeNode: ITreeNode = { id, name }idToTreeNode.set(id, treeNode)// 找到 parentNode 并加入到它的 childrenconst parentNode = idToTreeNode.get(parentId)if (parentNode) {!parentNode.children && parentNode.children = [] // 没有则初始化一个parentNode.children.push(treeNode)}// 找到根节点if (!parentId) root = treeNode})return root
}const tree = convert(arr)
console.log('tree: ', tree)
  • 遍历数组,生成 tree node

  • 找到parentNode,加入其children

  • 扩展:

    • 数组:像是mysql, 关系型
    • 树,像是文档型

将树转数组

const obj = {id: 1,name: '部门a',children: [{id: 2,name: '部门b',children: [{ id: 4, name: '部门d'}{ id: 5, name: '部门e'}]},{id: 3,name: '部门c',children: [{ id: 6, name: '部门f'}]}]
}interface IArrayItem {id: number,name: string,parentId: number
}interface ITreeNode {id: numbername: stringchildren?: ITreeNode[]
}const arr = []// 使用广度优先遍历,最好function convert(root: ITreeNode): IArrayItem[] {const nodeToParent: Map<ITreeNode, ITreeNode> = new Map()const arr: IArrayItem[] = []const queue = ITreeNode[] = []queue.unshift(root) // 根节点入队while(queue.length) {const curNode = queue.pop() // 出队if (!curNode) breakconst { id, name, children = [] } = curNode// 创建数组 item 并 pushconst parentNode = nodeToParent.get(curNode)const parentId = parentNode?.id || 0const item = { id, name, parentId }arr.push(item) // 只在这里加入// 子节点入队children.forEach(child => {// 映射 parentnodeToParent.set(child, curNode)// 入队queue.unshift(child)})}
}const arr = convert(obj)
console.log('arr:', arr)
http://www.lryc.cn/news/214719.html

相关文章:

  • 谷歌动态搜索广告被滥用引发恶意软件泛滥
  • C语言实现 1.在一个二维数组中形成 n 阶矩阵,2.去掉靠边元素,生成新的 n-2 阶矩阵;3.求矩阵主对角线下元素之和:4.以方阵形式输出数组。
  • 我在Vscode学OpenCV 处理图像
  • 【python】路径管理+路径拼接问题
  • C现代方法(第16章)笔记——结构、联合和枚举
  • Python项目——识别指定物品
  • Spring-创建非懒加载的单例Bean源码
  • Techlink TL24G06 网络变压器 10G 基座单端口变压器
  • Python操作PDF:PDF文件合并与PDF页面重排
  • 删除链表的倒数第n个节点(C++解法)
  • Apache服务的搭建与配置(超详细版)
  • 设计模式大赏(一):桥接模式,组合模式
  • 数据通信——应用层(DHCP的原理与配置)
  • 力扣151.反转字符串中的单词
  • vim三种模式,文本操作(操作字符/光标,列出行号可视化块模式/多文件查看)
  • jquery控制easyui中combobox、textbox显示隐藏
  • Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)
  • Servlet 初始化参数(web.xml和@WebServlet)
  • shell_62.shell脚本生成一个标准的 SQL INSERT 语句
  • 华为ICT——第五章语音处理理论与实践
  • ardupilot开发 --- SLAM 篇
  • Elasticsearch:在你的数据上训练大型语言模型 (LLM)
  • 拓展卡尔曼滤波EKF
  • 第四章 应用SysML基本特性集的汽车示例 P2(断更)|系统建模语言SysML实用指南学习
  • Vue入门——核心知识点
  • 使用opencv的tracking模块跟踪目标
  • Debian或Ubuntu静态交叉编译arm和aarch64
  • 最新ai系统ChatGPT程序源码+详细搭建教程+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画
  • 【设计模式】第16节:行为型模式之“命令模式”
  • 安装pytorch报错torch.cuda.is_available()=false的解决方法