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

封装js方法 构建树结构和扁平化树结构

在JavaScript中,构建树结构和将树结构扁平化是常见的操作。下面我将提供两个方法,一个用于从扁平化的数据中构建树结构,另一个用于将树结构扁平化。

构建树结构

假设我们有一个扁平化的数据列表,每个节点对象包含idparentId属性,我们可以根据这些属性构建树结构。

function buildTree(flatData) {const temp = {};const tree = [];for (const item of flatData) {temp[item.id] = {...item, children: []};}for (const item of flatData) {if (temp[item.parentId]) {temp[item.parentId].children.push(temp[item.id]);} else {tree.push(temp[item.id]);}}return tree;
}

扁平化树结构

如果我们有一个树结构,我们想要将其扁平化,可以使用下面的方法:

方法一:

function flattenTree(tree, parentId = null) {return tree.reduce((acc, node) => {const { children, ...rest } = node;const flattenedNode = { ...rest, parentId };return acc.concat(flattenedNode, flattenTree(children, node.id));}, []);
}

方法二:

function flattenTree(tree, parentId = null) {let flatArray = [];for (const node of tree) {const newNode = {...node, parentId}; // 创建新节点,包含parentIddelete newNode.children; // 删除children属性,因为我们要扁平化flatArray.push(newNode); // 添加到扁平化数组中if (node.children && node.children.length > 0) {// 如果有子节点,递归扁平化子节点flatArray = flatArray.concat(flattenTree(node.children, node.id));}}return flatArray;
}

示例

假设我们有以下扁平化数据:

const flatData = [{ id: 1, name: 'Root', parentId: null },{ id: 2, name: 'Child 1', parentId: 1 },{ id: 3, name: 'Child 2', parentId: 1 },{ id: 4, name: 'Grandchild 1', parentId: 2 },{ id: 5, name: 'Grandchild 2', parentId: 2 },
];

我们可以使用buildTree方法来构建树结构:

const tree = buildTree(flatData);
console.log(tree);

如果我们有一个树结构:

const treeData = [{id: 1,name: 'Root',children: [{id: 2,name: 'Child 1',children: [{ id: 4, name: 'Grandchild 1' },{ id: 5, name: 'Grandchild 2' },],},{ id: 3, name: 'Child 2' },],},
];

我们可以使用flattenTree方法来扁平化这个树结构:

const flatDataFromTree = flattenTree(treeData);
console.log(flatDataFromTree);

这两个方法可以相互转换树结构和扁平化数据结构,根据实际需求使用。

http://www.xdnf.cn/news/216199.html

相关文章:

  • 20_大模型微调和训练之-基于LLamaFactory+LoRA微调LLama3后格式合并
  • 水力压裂多裂缝扩展诱发光纤应变演化试验研究
  • 基于Mamba2的文本生成实战
  • 什么是 MCP?AI 应用的“USB-C”标准接口详解
  • AI赋能的问答系统:2025年API接口实战技巧
  • Vulkan与OpenGL的对比
  • 服务器主动发送响应?聊天模块如何实现?
  • 【Vue3/Typescript】合并多个pdf并预览打印,兼容低版本浏览器
  • CentOS NFS共享目录
  • 【GESP】C++三级练习 luogu-B2118 验证子串
  • 后验概率最大化(MAP)估计算法原理以及相具体的应用实例附C++代码示例
  • 源码编译安装LAMP
  • Python 3.12数据结构与算法革命
  • 实现使用Lucene对某个信息内容进行高频词提取并输出
  • 2025年04月29日Github流行趋势
  • TA学习之路——2.4 图形传统光照模型详解
  • HCIE证书失效?续证流程与影响全解析
  • Java 高级技术之Gradle
  • Ubuntu实现远程文件传输
  • C 语言 static 与 extern 详解
  • 海思SD3403边缘计算AI核心设备概述
  • 2025年欧洲西南部大停电
  • H3C ER3208G3路由实现内网机器通过公网固定IP访问内网服务器
  • 电流探头的消磁与直流偏置校准
  • 深入了解僵尸网络 IP:威胁与防范
  • Redis核心与底层实现场景题深度解析
  • 生物化学笔记:神经生物学概论04 视觉通路简介视网膜视网膜神经细胞大小神经节细胞(视错觉)
  • 故障诊断——复现github代码ClassBD-CNN(BDCNN)
  • BT136-ASEMI无人机专用功率器件BT136
  • 超详细复现—平抑风电波动的电-氢混合储能容量优化配置