0

0

如何将三个扁平数组合并构建嵌套树形数据结构

碧海醫心

碧海醫心

发布时间:2026-01-21 11:04:02

|

504人浏览过

|

来源于php中文网

原创

如何将三个扁平数组合并构建嵌套树形数据结构

本文介绍如何将通过多次 ajax 请求获取的三层扁平员工数据(根节点、一级子节点、二级子节点)按 `employeeid` 和父子关系动态组装为符合 treegrid 要求的嵌套树形结构,并提供可复用的递归挂载与扁平化工具函数。

在实际开发中(如使用 jqxTreeGrid、Ant Design Tree 或自定义树组件),常需将分层拉取的扁平数据构建成具有 children 属性的嵌套树结构。典型场景是:

  • 第一次请求获取顶级员工(如 EmployeeID: 2);
  • 第二次请求获取其直属下属(EmployeeID: [1,3,4,5,8]);
  • 第三次请求获取下级下属(如 EmployeeID: [6,7,9],隶属于 EmployeeID: 5)。

关键挑战在于:如何根据业务逻辑(如 ReportsTo 字段或预定义层级映射)将子数组精准挂载到对应父节点的 children 属性中? 原始数据中并未显式包含 ReportsTo 字段,因此需依赖外部约定(例如:第二层数组中的所有项均属于第一层中 EmployeeID: 2 的子节点;第三层数组中的项均属于第二层中 EmployeeID: 5 的子节点)。以下提供两种主流实现方式:

✅ 方案一:基于层级顺序 + 显式挂载(推荐用于可控数据源)

假设你已知层级归属关系(如后端返回时附带 parentId 字段),最健壮的方式是统一建模后递归挂载:

// 模拟三组异步获取的数据
const level0 = [{ EmployeeID: 2, FirstName: "Andrew", ... }]; // 根节点
const level1 = [
  { EmployeeID: 8, FirstName: "Laura", ReportsTo: 2 },
  { EmployeeID: 1, FirstName: "Nancy", ReportsTo: 2 },
  { EmployeeID: 5, FirstName: "Steven", ReportsTo: 2 }
];
const level2 = [
  { EmployeeID: 6, FirstName: "Michael", ReportsTo: 5 },
  { EmployeeID: 7, FirstName: "Robert", ReportsTo: 5 },
  { EmployeeID: 9, FirstName: "Anne", ReportsTo: 5 }
];

// 合并为单层扁平数组(含 parentId)
const allNodes = [...level0, ...level1, ...level2];

// 构建树:O(n) 时间复杂度
function buildTree(nodes, idKey = 'EmployeeID', parentKey = 'ReportsTo') {
  const nodeMap = new Map();
  const roots = [];

  // 第一遍:建立 ID → 节点映射
  nodes.forEach(node => {
    nodeMap.set(node[idKey], { ...node, children: [] });
  });

  // 第二遍:挂载子节点
  nodes.forEach(node => {
    const parentId = node[parentKey];
    const currentNode = nodeMap.get(node[idKey]);

    if (parentId == null || !nodeMap.has(parentId)) {
      roots.push(currentNode);
    } else {
      nodeMap.get(parentId).children.push(currentNode);
    }
  });

  return roots;
}

const treeData = buildTree(allNodes);
console.log(treeData); // 输出符合要求的嵌套结构
⚠️ 注意:若原始数据无 ReportsTo,需在请求时明确传递上下文(如 /api/employees?parent=2),或由前端维护映射表(如 parentMap = {2: [1,3,4,5,8], 5: [6,7,9]})。

✅ 方案二:按预设层级顺序手动组装(适用于固定结构)

若层级关系严格固定(如“第二组一定属于第一组首个元素”),可用简洁方式手动挂载:

Quinvio AI
Quinvio AI

AI辅助下快速创建视频,虚拟代言人

下载
// 假设 level0 仅含一个根节点
if (level0.length > 0) {
  level0[0].children = level1;
  // 手动查找 level1 中 EmployeeID === 5 的节点,并挂载 level2
  const managerNode = level1.find(emp => emp.EmployeeID === 5);
  if (managerNode) {
    managerNode.children = level2;
    managerNode.expanded = "true"; // 可选:控制默认展开
  }
}
// level0 即为最终树根
const finalTree = level0;

? 辅助函数:嵌套结构 ↔ 扁平数组互转

开发调试时,常需将嵌套树转为扁平列表(如用于搜索、导出):

// 嵌套 → 扁平(广度优先)
function nestedToLinear(data) {
  const result = [];
  const queue = [...data];

  while (queue.length > 0) {
    const node = queue.shift();
    result.push({ ...node, children: undefined }); // 移除 children 避免循环引用
    if (Array.isArray(node.children) && node.children.length > 0) {
      queue.push(...node.children);
    }
  }
  return result;
}

// 使用示例
console.log(nestedToLinear(treeData)); // 输出单层数组,含全部节点

✅ 总结

  • 核心原则:树结构构建 = “建立节点索引 + 按关系挂载”,而非硬编码 children: [...];
  • 生产建议:后端应返回 id + parentId 字段,前端用 buildTree() 统一处理,避免耦合层级逻辑;
  • 性能注意:Map 查找为 O(1),整套构建为 O(n),远优于嵌套循环;
  • 扩展性:该模式天然支持 N 层嵌套,无需修改逻辑。

通过以上方法,你可灵活将任意数量的扁平数组组合为标准树形数据,无缝对接各类 TreeGrid 组件。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

155

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

159

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

112

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.09.24

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

21

2026.01.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

20

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Vue 教程
Vue 教程

共42课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号