【前端面试】list转树、拍平, 指标,

news/2024/12/18 23:35:16/

这个题目涉及的是将一组具有父子关系的扁平数据转换为树形结构,通常称为“树形结构的构建”问题。类似的题目包括:

1. 组织架构转换

给定一个公司的员工列表,每个员工有 idmanagerId,其中 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. 文件夹和文件结构

给定一个文件夹和文件列表,每个文件或文件夹有 idnameparentId,表示文件夹和文件之间的层级关系,任务是构建文件夹和文件的层级树。

示例:

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. 评论/回复树

给定一组评论数据,其中每个评论包含 idparentIdcontent,任务是将这些评论转换为树形结构,其中 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. 分类树

给定商品分类列表,其中每个分类有 idparentIdname,任务是将这些分类转换为树形结构。

示例:

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 等,页面的性能表现应相对稳定,不会出现因网络波动而导致页面长时间无法加载或频繁出错的情况 。

http://www.ppmy.cn/news/1556232.html

相关文章

MSSQL AlwaysOn 可用性组(Availability Group)中的所有副本均不健康排查步骤和解决方法

当遇到 MSSQL AlwaysOn 可用性组(Availability Group)中的所有副本均不健康的情况时(MSSQL AG 副本名称: All replicas unhealthy),这通常意味着可用性组无法正常工作,数据同步和故障转移功能可能受到影响。以下是一些可能的原因及相应的排查步骤和解决方法: 1. 检查副本…

数据版本管理和迁移工具Flyway用法最简说明

简介 数据库迁移及版本控制工具, 用于维护不同环境下数据库的一致性 使用 引入依赖 implementation(“org.flywaydb:flyway-core:7.1.1”) 配置 spring:flyway:enabled: truelocations: classpath:sqlbaseline-on-migrate: trueclean-disabled: trueenabled: true # 开启Fl…

Java——网络编程(下)

(UDP通讯的实现) 1 UDP通信介绍 (面向无链接的一个传输协议——>不会创建连接——>效率高) (发送数据要经行封包操作——>使用DatagramPacket类——>底层是UDP) (DatagramPacket——>数据封包——>发送数据和接收数据都要去包装对象!&#xf…

Cisco Packet Tarcer配置计网实验笔记

文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…

力扣-图论-10【算法学习day.60】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…

区间和并-

题目一&#xff1a;1399: 校门外的树 P1399 - 校门外的树 - HAUEOJ 代码 #include<bits/stdc.h> using namespace std;using PII pair<int,int>; const int N 1e510; vector<PII>a, b;int main() {int n, m;cin >> n >> m;while(m --) {int …

神州数码DCME-320 online_list.php 任意文件读取漏洞复现

0x01 产品描述: ‌神州数码DCME-320是一款高性能多业务路由器,专为多用户、多流量和多业务种类需求设计‌。它采用了

#GC4049. GC.2017---. GC.2016.六年级

这套题包含了历年真题&#xff0c;包含了前面我写的博客中的题目&#xff0c;十分重要&#xff01;&#xff01;&#xff01;&#xff01;要考试的同学可以参考一下&#xff01;&#xff01; 此套题限时3小时。 #GC4049. GC.2017.六年级.01.更多闰年 题目描述 在 smoj 网站上…