【前端】【功能函数】treeMapEach,对每个节点进行自定义转换的实用函数

devtools/2025/2/25 12:33:39/

一、功能说明

这是一个递归遍历树形结构数据,并对每个节点进行自定义转换的实用函数。它会对原始树中的每个节点执行 conversion 函数,最终生成一个包含转换后结果的新树结构。

二、核心作用

  1. 树形结构遍历:深度优先递归遍历所有子节点
  2. 数据格式转换:通过自定义函数修改节点数据结构
  3. 字段映射:可指定子节点字段名称(默认 children
  4. 非破坏性操作:返回新对象,不修改原始数据

三、代码注释解析

/*** 递归映射树形结构* @param data 当前节点数据* @param children 子节点字段名(默认'children')* @param conversion 节点转换函数*/
export const treeMapEach = (data: any,{ children = 'children', conversion }: { children?: string; conversion: Fn }
) => {// 判断是否存在有效子节点const haveChildren = Array.isArray(data[children]) && data[children].length > 0// 执行当前节点转换const conversionData = conversion(data) || {}// 递归处理子节点if (haveChildren) {return {...conversionData, // 合并转换后的数据[children]: data[children].map((i: number) => // 映射子节点treeMapEach(i, { children, conversion }))}} // 无子节点时直接返回else {return { ...conversionData }}
}

四、使用示例

// 示例数据
const treeData = {id: 1,name: 'Root',children: [{ id: 2, name: 'Child', children: [{ id: 3, name: 'Grandchild' }]}]
}// 转换函数:将 name 转为 label,并添加 level 字段
const convertedTree = treeMapEach(treeData, {conversion: (node) => ({label: node.name,level: node.id.toString()})
})/* 输出结果:
{label: "Root",level: "1",children: [{label: "Child",level: "2",children: [{ label: "Grandchild", level: "3" }]}]
}
*/

五、应用场景详解

  1. 数据格式化:API数据 → 前端所需格式
  2. 字段重命名:统一不同数据源的字段命名
  3. 数据过滤:通过转换函数排除特定节点
  4. 添加元数据:为每个节点附加计算属性
  5. 结构简化:去除冗余字段,精简数据结构

六、技术文章

《树形结构映射工具深度解析》

在处理树形数据时,我们常需要将原始数据转换为特定格式。treeMapEach 函数提供了一种优雅的解决方案,其核心优势在于:

1. 灵活配置

  • 支持自定义子节点字段名,兼容不同数据格式
  • 转换函数自由定义,满足各种业务需求
  • 保留原始数据结构,仅修改指定内容

2. 实现原理
采用深度优先遍历策略,通过递归调用实现层级处理。每次递归都会:

  • 执行当前节点转换
  • 判断子节点存在性
  • 递归处理子节点数组

3. 性能特点

  • 时间复杂度:O(n) 线性复杂度
  • 空间复杂度:O(n) 生成新对象
  • 尾递归优化:适合处理深层树结构

4. 扩展应用

// 示例1:数据脱敏
treeMapEach(userData, {conversion: (node) => ({...node,phone: node.phone.replace(/^(\d{3})\d+(\d{4})$/, '$1****$2')})
})// 示例2:权限过滤
treeMapEach(menuData, {conversion: (node) => node.visible ? node : null
}).children.filter(Boolean)

5. 注意事项

  • 确保树结构无循环引用
  • 转换函数应返回对象类型
  • 大数据量时建议使用迭代方式
  • 建议配合TypeScript类型定义使用

该函数已成功应用于多个实际项目,包括:

  • 组织架构树展示
  • 商品分类系统
  • 权限管理系统
  • 可视化决策树

通过合理使用 treeMapEach,开发者可以显著提升树形数据处理的开发效率,同时保证代码的可维护性和扩展性。


http://www.ppmy.cn/devtools/161585.html

相关文章

vue怎么设置允许局域网手机访问

打开vite.config.ts 添加 server: {host: 0.0.0.0}, host: 0.0.0.0:设置为0.0.0.0,允许从所有IP访问。port: 5173:指定端口号,可以根据需要进行修改。不指定默认 5173disableHostCheck: true:禁用主机检查&#xff0c…

解锁Redis的深层能力:事务与消息队列的最佳实践

在当今数据驱动的世界里,高效的数据管理和处理成为了每一个成功应用的核心。Redis,作为一款高性能的内存数据库,不仅以其快速读写能力著称,还提供了诸如事务、持久化、以及灵活的消息队列实现等高级功能,使得开发者能够…

Java中的JIT编译器优化机制

Java中的JIT编译器优化机制 1. 引言 Java程序的性能一直是开发者关注的重点之一。随着JIT(Just-In-Time)编译技术的引入,Java程序的执行效率有了显著的提升。JIT编译器通过将字节码在运行时编译为本地机器代码,从而避免了每次执…

AI手机的技术细节

前序:先说各个功能涉及到的技术,再说宏观系统架构。AI手机有这样几个做法,给手机侧边增加一个按键;把手机的语音助手做的很好,能够快速稳定的进行唤醒;通过特殊形式的触摸手机的曲面屏位置等来进行唤醒AI …

如何使用3D高斯分布进行环境建模

使用3D高斯分布来实现建模,主要是通过高斯分布的概率特性来描述空间中每个点的几何位置和不确定性。具体来说,3D高斯分布被用来表示点云数据中的每一个点或体素(voxel)的空间分布和不确定性,而不是单纯地存储每个点的坐…

代码随想录Day46 | 647.回文子串,516.最长回文子序列

代码随想录Day46 | 647.回文子串,516.最长回文子序列 647.回文子串 dp[i][j]定义: 与其他动态规划题目不同,一般题目求什么,dp就定义为什么 这道题的dp定义为区间范围[i,j]的子串是否是回文子串 需要注意遍历顺序 需要用到dp[i 1][j - 1]&…

LeetCode 热题 100 94. 二叉树的中序遍历

LeetCode 热题 100 | 94. 二叉树的中序遍历 大家好,今天我们来解决一道经典的算法题——二叉树的中序遍历。这道题在 LeetCode 上被标记为简单难度,要求我们给定一个二叉树的根节点 root,返回它的中序遍历结果。下面我将详细讲解解题思路&am…

vue2版本elementUI的table分页实现多选逻辑

1. 需求 我们需要在表格页上实现多选要求,该表格支持分页逻辑。 2. 认识属性 表格属性 参数说明类型可选值默认值data显示的数据array——row-key行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时&…