前端小技巧: 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病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
