前端小技巧: 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)
相关文章:
前端小技巧: 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:…...
谷歌动态搜索广告被滥用引发恶意软件泛滥
研究人员发现了一种新方法,可以利用易受攻击的网站向搜索引擎用户发送恶意的、有针对性的广告,这种方法能够传播大量恶意软件,使受害者完全不知所措。 关键是“动态搜索广告”,谷歌利用网站登陆页面的内容将目标广告与搜索配对的…...
C语言实现 1.在一个二维数组中形成 n 阶矩阵,2.去掉靠边元素,生成新的 n-2 阶矩阵;3.求矩阵主对角线下元素之和:4.以方阵形式输出数组。
矩阵形式: 1 1 1 1 1 2 1 1 1 1 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 完整代码: /*编写以下函数 1.在一个二维数组中形成如以下形式的 n 阶矩阵: 1 1 1 1 1 2 1 1 1 1 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 2.去掉…...
我在Vscode学OpenCV 处理图像
既然我们是面向Python的OpenCV(OpenCV for Python)那我们就必须要熟悉Numpy这个库,尤其是其中的数组的库,Python是没有数组的,唯有借助他库才有所实现想要的目的。 # 老三样库--事先导入 import numpy as np import c…...
【python】路径管理+路径拼接问题
路径管理 问题相对路径问题绝对路径问题 解决os库pathlib库最终解决 问题 环境:python3.7.16 win10 相对路径问题 因为python的执行特殊性,使用相对路径时,在不同路径下用python指令会有不同的索引效果(python的项目根目录根据执…...
C现代方法(第16章)笔记——结构、联合和枚举
文章目录 第16章 结构、联合和枚举16.1 结构变量16.1.1 结构变量的声明16.1.2 结构变量的初始化16.1.3 指示器(C99)16.1.4 对结构的操作 16.2 结构类型16.2.1 结构标记的声明16.2.2 结构类型的定义16.2.3 结构作为参数和返回值16.2.4 复合字面量(C99)16.2.5 匿名结构(C1X) 16.3…...
Python项目——识别指定物品
目录 1、百度EasyDL平台数据配置 1.1、训练图像上传 1.2、训练图像进行标注 1.3、训练模型 1.4、检验识别 1.5、申请发布 1.6、控制台权限配置 2、Python调用物体识别API 本项目是基于百度EasyDL平台制作的识别转盘内瓶子,且识别瓶子位置的一个项目。通过在…...
Spring-创建非懒加载的单例Bean源码
补充:关于扫描的逻辑 /*** Scan the class path for candidate components.* param basePackage the package to check for annotated classes* return a corresponding Set of autodetected bean definitions*/ public Set<BeanDefinition> findCandidateCo…...
Techlink TL24G06 网络变压器 10G 基座单端口变压器
功能特征: 1、符合IEEE 802.3标准。 2、符合RoHS。 3、工作温度范围:0C至70C。 4、储存温度范围:-20C至125C。...
Python操作PDF:PDF文件合并与PDF页面重排
处理大量的 PDF 文档是非常麻烦的事情,频繁地打开关闭文件会严重影响工作效率。对于一大堆内容相关的 PDF 文件,我们在处理时可以将这些 PDF 文件合并起来,作为单一文件处理,从而提高处理效率。同时,我们也可以选取不同…...
删除链表的倒数第n个节点(C++解法)
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&#…...
Apache服务的搭建与配置(超详细版)
前言 Apache是一种常见的Web服务器软件,广泛用于Linux和其他UNIX操作系统上。它是自由软件,可以通过开放源代码的方式进行自由分发和修改。Apache提供了处理静态和动态内容的能力,而且还支持多种编程语言和脚本,如PHP、Python和P…...
设计模式大赏(一):桥接模式,组合模式
设计模式大赏(一):桥接模式,组合模式 导言 本篇文章是设计模式大赏中的第一篇文章,这个系列的文章中我们主要将介绍一些常见的设计模式,主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要…...
数据通信——应用层(DHCP的原理与配置)
引言 假如我们的网络中有N台设备,它们都要设置IP地址,如果人工去一个个配置不仅不方便管理还很麻烦。因此我们用DHCP来自动分配地址。 一,系统的启动流程 不仅是计算机、很多网络设备的启动流程如下: 设备上电后,硬件…...
力扣151.反转字符串中的单词
原题链接:力扣151.反转字符串中的单词 全代码: 需要复刷 class Solution { public:void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []for (int i start, j end; i < j; i, j--) {swap(s[i],…...
vim三种模式,文本操作(操作字符/光标,列出行号可视化块模式/多文件查看)
目录 vim--文本编辑器 功能 基本概念 命令/默认模式 插入模式 底行模式 文本操作 引入 移动光标位置 删除字符 -- x/dd 复制/粘贴字符 -- yw/yyp 替换文本 -- r / %s 底行模式 全局替换 -- /g 撤销操作 -- u / ctrlr 修改字符 -- cw 示例 跳行 -- ctrlg 底行…...
jquery控制easyui中combobox、textbox显示隐藏
//combobox下拉框 $("#下拉框id.combo").hide();//textbox输入框 $("#输入框id.textbox").hide(); 参考网址: https://blog.csdn.net/Coldmood/article/details/128279727...
Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4)
Android拖放startDragAndDrop拖拽onDrawShadow静态添加xml布局View,Kotlin(4) import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import a…...
Servlet 初始化参数(web.xml和@WebServlet)
1、通过web.xml方式 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xm…...
shell_62.shell脚本生成一个标准的 SQL INSERT 语句
无论是将文件读入脚本,还是将数据从脚本输出到文件,都会用到文件重定向,这是一种很 常见的操作。本节中的示例脚本两种功能皆有。它会读取 CSV 格式的数据文件,输出 SQL INSERT 语句,并将数据插入数据库。 shell 脚本使…...
【仅限头部AI团队内部流通】DeepSeek-Coder 33B代码生成延迟优化白皮书(含vLLM 0.6.3 patch补丁包)
更多请点击: https://kaifayun.com 第一章:DeepSeek-Coder 33B模型架构与延迟瓶颈全景分析 DeepSeek-Coder 33B 是一款专为代码理解与生成优化的开源大语言模型,基于标准 LLaMA 架构演进,采用 64 层 Transformer 解码器堆叠&…...
如何快速解决Windows依赖问题:终极系统优化指南
如何快速解决Windows依赖问题:终极系统优化指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过打开心爱的游戏时突然弹出"缺少…...
如何永久保存微信聊天记录?这款开源工具帮你一键导出并生成年度报告!
如何永久保存微信聊天记录?这款开源工具帮你一键导出并生成年度报告! 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com…...
Cursor Free VIP:终极解决方案,5步实现Cursor Pro永久免费使用
Cursor Free VIP:终极解决方案,5步实现Cursor Pro永久免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: You…...
2026年5款AI视频文案生成工具对比实测,批量口播脚本如何兼顾爆款逻辑与工程复用?
每天要写30条口播脚本,但爆款逻辑难复现一位MCN内容组长在CSDN发帖提问:‘团队6个编导轮班写口播稿,爆款率不到12%,新来的实习生连黄金三秒都卡不准;想上AI工具,结果生成的文案要么太泛、要么套话堆砌&…...
Trivy容器镜像漏洞扫描原理与企业级实战指南
1. 为什么是Trivy?不是Clair、Notary,也不是Docker Scout的内置扫描 我第一次在CI流水线里看到镜像扫描失败的告警邮件时,正蹲在客户现场调试一个K8s集群的网络策略。邮件标题写着“critical vulnerability in nginx:1.21.6-alpine”&#x…...
ide-eval-resetter深度解析:JetBrains IDE试用期管理架构揭秘
ide-eval-resetter深度解析:JetBrains IDE试用期管理架构揭秘 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter ide-eval-resetter作为JetBrains IDE试用期重置的专业工具,通过分布式评估数据…...
人机协同决策:AI如何通过认知冲突提升专家判断力
1. 人机协同决策的认知悖论:当“不如你”的AI成为你的最佳搭档在医疗诊断室里,一位经验丰富的放射科医生正在审阅一张肺部CT影像。他的初步判断是良性结节,但屏幕角落弹出的AI辅助诊断系统却给出了“疑似恶性”的提示,置信度显示为…...
渗透测试学习路线:从原生终端到实战靶场的系统路径
1. 这不是“速成课”,而是一张你真正能踩出脚印的地图很多人点开“渗透测试学习路线”时,心里想的是:学三个月能不能接单?能不能进红队?能不能年薪30万?我试过在2019年用两周时间刷完某平台全部CTF入门题&a…...
如何实现Windows硬件指纹伪装:EASY-HWID-SPOOFER深度技术指南
如何实现Windows硬件指纹伪装:EASY-HWID-SPOOFER深度技术指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在当今数字时代,硬件指纹追踪已成为隐私保护的…...
