【前端面试】list转树、拍平, 指标,
这个题目涉及的是将一组具有父子关系的扁平数据转换为树形结构,通常称为“树形结构的构建”问题。类似的题目包括:
1. 组织架构转换
给定一个公司的员工列表,每个员工有 id 和 managerId,其中 managerId 表示该员工的上级。任务是将这个员工列表转换为一个树形的组织架构。
示例:
const employees = [{ id: 1, name: 'CEO', managerId: null },{ id: 2, name: 'CTO', managerId: 1 },{ id: 3, name: 'Engineer 1', managerId: 2 },{ id: 4, name: 'Engineer 2', managerId: 2 },{ id: 5, name: 'CFO', managerId: 1 },{ id: 6, name: 'Accountant', managerId: 5 }
];
目标: 将这些数据转换为组织架构树。
const ROOT_MANAGER_ID = null;function buildOrgChart(employees) {const map = new Map();let roots = [];employees.forEach((employee) => {map.set(employee.id, { ...employee, subordinates: [] });});employees.forEach((employee) => {const currentEmployee = map.get(employee.id);const managerId = employee.managerId;if (managerId === ROOT_MANAGER_ID) {roots.push(currentEmployee); // 如果没有经理,就认为是根节点} else {const manager = map.get(managerId);if (manager) {manager.subordinates.push(currentEmployee); // 将下属添加到经理的子节点数组} else {console.error(`Invalid managerId ${managerId} for employee with id ${employee.id}`);}}});return roots;
}const orgChart = buildOrgChart(employees);
console.log(JSON.stringify(orgChart, null, 2));
2. 文件夹和文件结构
给定一个文件夹和文件列表,每个文件或文件夹有 id、name 和 parentId,表示文件夹和文件之间的层级关系,任务是构建文件夹和文件的层级树。
示例:
const items = [{ id: 1, name: 'root', parentId: null },{ id: 2, name: 'Folder 1', parentId: 1 },{ id: 3, name: 'File 1', parentId: 2 },{ id: 4, name: 'File 2', parentId: 2 },{ id: 5, name: 'Folder 2', parentId: 1 },{ id: 6, name: 'File 3', parentId: 5 }
];
目标: 将文件夹和文件转换为树形结构。
const ROOT_PARENT_ID = null;function buildFileStructure(items) {const map = new Map();let roots = [];items.forEach((item) => {map.set(item.id, { ...item, children: [] });});items.forEach((item) => {const currentItem = map.get(item.id);const parentId = item.parentId;if (parentId === ROOT_PARENT_ID) {roots.push(currentItem); // 如果没有父文件夹,则认为是根文件夹} else {const parent = map.get(parentId);if (parent) {parent.children.push(currentItem); // 将当前文件或文件夹添加到父节点的 children 数组} else {console.error(`Invalid parentId ${parentId} for item with id ${item.id}`);}}});return roots;
}const fileStructure = buildFileStructure(items);
console.log(JSON.stringify(fileStructure, null, 2));
3. 评论/回复树
给定一组评论数据,其中每个评论包含 id、parentId 和 content,任务是将这些评论转换为树形结构,其中 parentId 为 null 或 0 表示根评论。
示例:
const comments = [{ id: 1, parentId: null, content: 'First comment' },{ id: 2, parentId: 1, content: 'Reply to first comment' },{ id: 3, parentId: 1, content: 'Another reply to first comment' },{ id: 4, parentId: 2, content: 'Reply to reply' }
];
目标: 将评论转换为树形结构。
const ROOT_PARENT_ID = null;function buildCommentTree(comments) {const map = new Map();let roots = [];comments.forEach((comment) => {map.set(comment.id, { ...comment, replies: [] });});comments.forEach((comment) => {const currentComment = map.get(comment.id);const parentId = comment.parentId;if (parentId === ROOT_PARENT_ID) {roots.push(currentComment); // 如果没有父评论,则认为是根评论} else {const parent = map.get(parentId);if (parent) {parent.replies.push(currentComment); // 将当前评论添加到其父评论的 replies 数组} else {console.error(`Invalid parentId ${parentId} for comment with id ${comment.id}`);}}});return roots;
}const commentTree = buildCommentTree(comments);
console.log(JSON.stringify(commentTree, null, 2));
4. 分类树
给定商品分类列表,其中每个分类有 id、parentId 和 name,任务是将这些分类转换为树形结构。
示例:
const categories = [{ id: 1, name: 'Electronics', parentId: null },{ id: 2, name: 'Computers', parentId: 1 },{ id: 3, name: 'Laptops', parentId: 2 },{ id: 4, name: 'Smartphones', parentId: 1 }
];
目标: 将分类列表转换为树形结构。
const ROOT_PARENT_ID = null;function buildCategoryTree(categories) {const map = new Map();let roots = [];categories.forEach((category) => {map.set(category.id, { ...category, subcategories: [] });});categories.forEach((category) => {const currentCategory = map.get(category.id);const parentId = category.parentId;if (parentId === ROOT_PARENT_ID) {roots.push(currentCategory); // 根分类} else {const parent = map.get(parentId);if (parent) {parent.subcategories.push(currentCategory); // 添加子分类} else {console.error(`Invalid parentId ${parentId} for category with id ${category.id}`);}}});return roots;
}const categoryTree = buildCategoryTree(categories);
console.log(JSON.stringify(categoryTree, null, 2));
这些题目都涉及构建树形结构,核心的思想是遍历节点,将每个节点的父子关系映射到树形结构上,通常会用到哈希表(如 Map)来缓存节点,以避免多次查找。
评定指标
性能方面
- 加载性能:通过工具测量 FCP(首次内容绘制)和 LCP(最大内容绘制)指标,理想的 FCP 应在1.8秒内,LCP 应在2.5秒内。TTFB(首字节时间)也很关键,其理想时间应在800毫秒内,该指标反映了服务器响应速度及网络传输等综合情况.
- 交互性能:FID(首次输入延迟)测量用户首次交互到浏览器响应的时间,应在100毫秒内响应用户输入。TBT(总阻塞时间)反映长任务对主线程的阻塞情况,移动设备上应低于300毫秒,桌面 Web 上应低于100毫秒.
- 渲染性能:动画或滚动需在10毫秒内生成每一帧,以保证视觉平滑。可查看页面在滚动、切换等交互时的动画效果是否流畅.
- 资源优化:查看页面的 HTTP 请求数量和资源大小,合理减少请求数量、压缩资源文件,如压缩 CSS、JavaScript 和图片等,可加快页面加载速度.
稳定性方面
- 页面布局稳定性:CLS(累积布局偏移)用于衡量页面布局在加载过程中的变化情况,其值应控制在0.1以内,以确保用户浏览时页面元素不会出现意外的大幅移动.
- 兼容性:检查页面在不同浏览器、不同设备及不同屏幕分辨率下的显示和交互是否正常,确保网站的兼容性,提高用户体验的一致性。
- 错误处理:查看控制台是否有 JavaScript 错误、资源加载失败等问题,若有则会影响页面的正常功能和稳定性,需及时修复。
- 性能的一致性:在不同的网络环境下,如宽带、4G、5G 等,页面的性能表现应相对稳定,不会出现因网络波动而导致页面长时间无法加载或频繁出错的情况 。
相关文章:
【前端面试】list转树、拍平, 指标,
这个题目涉及的是将一组具有父子关系的扁平数据转换为树形结构,通常称为“树形结构的构建”问题。类似的题目包括: 1. 组织架构转换 给定一个公司的员工列表,每个员工有 id 和 managerId,其中 managerId 表示该员工的上级。任务…...
游戏引擎学习第43天
仓库 https://gitee.com/mrxiao_com/2d_game 介绍运动方程 今天我们将更进一步,探索运动方程,了解真实世界中的物理,并调整它们,以创建一种让玩家感觉愉悦的控制体验。这并不是在做一个完美的物理模拟,而是找到最有趣…...
NVM:安装配置使用(详细教程)
文章目录 一、简介二、安装 nvm三、配置 nvm 镜像四、配置环境变量五、使用教程5.1 常用命令5.2 具体案例 六、结语 一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同,而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题,它可以在…...
matlab测试ADC动态性能的原理
目录 摘要: 简介: 动态规范和定义 动态规格: 双面到单边的功率谱转换 摘要: 模数转换器(adc)代表了接收器、测试设备和其他电子设备中的模拟世界和数字世界之间的联系。正如本文系列的第1部分中所概述…...
PostgreSQL JSON/JSONB 查询与操作指南
PostgreSQL 提供了强大的 JSON 和 JSONB 数据类型及相关操作,适用于存储和查询半结构化数据。本文将详细介绍其常用操作。 1. 基础操作 1.1 JSON 属性访问 ->: 返回 JSON 对象中的值,结果为 JSON 格式。 SELECT {"a": {"b": 1…...
【Isaac Lab】Ubuntu22.04安装英伟达驱动
目录 1.1 禁用nouveau驱动 1.2 安装必要的依赖项 1.3 下载安装 1.4 查看是否安装成功 1.5 安装CUDA 1.5.1 下载 1.5.2 按照提示进行下载安装 1.5.3 添加环境变量 1.5.4 测试CUDA是否安装成功 1.1 禁用nouveau驱动 输入以下命令打开blacklist.conf文件 sudo vim /etc…...
JS,递归,处理树形数据组件,模糊查询树形结构数据字段
JS递归如何模糊查询树形结构数据,根据数据中的某一个字段值,模糊匹配 直接拿去使用就行 function filterTreeLabel(arr, label) {let result []arr.forEach((item) > {// if (String(item.POBJECT_NAME).toLowerCase().indexOf(label)!-1) {if (String(item.P…...
神州数码DCME-320 online_list.php 任意文件读取漏洞复现
0x01 产品描述: 神州数码DCME-320是一款高性能多业务路由器,专为多用户、多流量和多业务种类需求设计。它采用了...
nginx的内置变量以及nginx的代理
nginx的内置变量 客户端 命令含义$uri可以获取客户端请求的地址,包含主机和查询的参数$request_uri:获取客户端的请求地址,包含主机和查询参数。$host:请求的主机名,客户端—发送请求的url地址$http_user_agent获取客户端请求的浏览器和操作…...
ubuntu监测硬盘状态
安装smartmontools smartctl -l error /dev/sdk smartctl -i /dev/sda lshw -class disk smartctl -H /dev/sd 结果1: 结果2:PASSED,这表示硬盘健康状态良好 smartctl -a /dev/sdb sdk lsblk blkid 测试写入速度 time dd if/dev/zero of…...
3.2.1.2 汇编版 原子操作 CAS
基本原理说明 在 x86 和 ARM 架构上,原子操作通常利用硬件提供的原子指令来实现,比如 LOCK 前缀(x86)或 LDREX/STREX(ARM)。以下是一些关键的原子操作(例如原子递增和比较交换)的汇…...
InnoDB事务系统(二):事务的实现
事务隔离性由锁来实现。原子性、一致性、持久性通过数据库的 redo log 和 undo log 来完成。 redo log 称为重做日志,用来保证事务的原子性和持久性。undo log 用来保证事务的一致性。 有的 DBA 或许会认为 undo 是 redo 的逆过程,其实不然。redo 和 u…...
xdoj :模式匹配
模式匹配 题目描述: 接收信号中包含特定的信号模式,对接收信号进行检测,以统计特定模式出现的次数。 例如接收信号为 9 3 5 7 5 8 6 3 5 7 1 9 3 5 7,如果特定信号为 3 5 7,则接收信号中包含了 3 个特定模式。通过键…...
Redis的基本使用命令(GET,SET,KEYS,EXISTS,DEL,EXPIRE,TTL,TYPE)
目录 SET GET KEYS EXISTS DEL EXPIRE TTL redis中的过期策略是怎么实现的(面试) 上文介绍reids的安装以及基本概念,本章节主要介绍 Redis的基本使用命令的使用 Redis 是一个基于键值对(KEY - VALUE)存储的…...
LruCache(本地cache)生产环境中遇到的问题及改进
问题:单机qps增加时请求摘要后端,耗时也会增加,因为超过了后端处理能力(最大qps,存在任务堆积)。 版本一 引入LruCache。为了避免数据失效,cache数据的时效性要小于摘要后端物料的更新时间&…...
智慧公交指挥中枢,数据可视化 BI 驾驶舱
随着智慧城市的蓬勃发展,公共交通作为城市运营的核心枢纽,正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network,控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术,构建的公交“大脑”…...
【计算机网络】期末考试预习复习|上
作业讲解 物理层作业 共有4个用户进行CDMA通信。这4个用户的码片序列为: A: (–1 –1 –1 1 1 –1 1 1);B: (–1 –1 1 –1 1 1 1 –1) C: (–1 1 –1 1 1 1 –1 –1);D: (–1 1 –1 –1 –1 –1 1 –1) 现收到码片序列:(–1 1 –…...
YOLOv8目标检测(四)_图片推理
YOLOv8目标检测(一)_检测流程梳理:YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集:YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型:YOLOv8目标检测(三)_训…...
AI工具如何深刻改变我们的工作与生活
在当今这个科技日新月异的时代,人工智能(AI)已经从科幻小说中的概念变成了我们日常生活中不可或缺的一部分。从智能家居到自动驾驶汽车,从医疗诊断到金融服务,AI正以惊人的速度重塑着我们的世界。 一、工作方式的革新…...
springboot中——Logback介绍
程序中的日志,是用来记录应用程序的运行信息、状态信息、错误信息等。 Logback基本使用 springboot的依赖自动传递了logback的依赖,所以不用再引入依赖 之后在resources文件下创建logback.xml文件,写入 <?xml version"1.0" …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
