【前端】【功能函数】eachTree,封装一个通用的遍历树结构的模板

news/2025/2/26 1:24:22

《递归遍历树结构函数 eachTree 的详解》

一、函数概述

eachTree 是一个用于递归遍历树结构数据的工具函数。在前端开发中,树结构数据(如菜单树、组织结构树等)经常会被使用,对树结构进行遍历并执行一些操作是常见的需求。该函数可以帮助开发者方便地对树结构中的每个节点执行自定义操作。

二、代码解释
/**
 * 递归遍历树结构
 * @param treeDatas 树
 * @param callBack 回调
 * @param parentNode 父节点
 */
export const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {
  treeDatas.forEach((element) => {
    const newNode = callBack(element, parentNode) || element;
    if (element.children) {
      eachTree(element.children, callBack, newNode);
    }
  });
};
  1. 参数说明

    • treeDatas:类型为 any[],表示要遍历的树结构数据,是一个包含多个节点对象的数组。
    • callBack:类型为 Fn(这里假设 Fn 是一个自定义的函数类型,通常是一个接收两个参数的函数),用于对每个节点执行自定义操作。该回调函数接收两个参数:当前节点 element 和其父节点 parentNode,并返回一个新的节点对象。
    • parentNode:类型为 object,表示当前节点的父节点,默认值为空对象 {}
  2. 函数逻辑

    • 使用 forEach 方法遍历 treeDatas 数组中的每个节点。
    • 调用 callBack 函数处理当前节点,并将处理结果赋值给 newNode。如果 callBack 函数返回 nullundefined,则使用原节点 element 作为 newNode
    • 检查当前节点是否有 children 属性,如果有,则递归调用 eachTree 函数,继续遍历子节点。递归时,将子节点数组作为新的 treeDatascallBack 函数保持不变,newNode 作为新的 parentNode
三、函数作用

该函数的主要作用是对树结构数据进行深度优先遍历,并对每个节点执行自定义操作。通过传入不同的回调函数,可以实现不同的功能,如节点数据的修改、节点筛选、节点属性的统计等。

四、使用示例

以下是一个具体的使用示例,假设我们有一个菜单树结构数据,需要为每个节点添加一个 fullPath 属性,表示该节点在树中的完整路径。

// 定义树结构数据
const menuTree = [
  {
    id: 1,
    name: 'Home',
    children: [
      {
        id: 2,
        name: 'About',
        children: [
          {
            id: 3,
            name: 'Team'
          }
        ]
      }
    ]
  }
];

// 定义回调函数
const addFullPath = (node, parentNode) => {
  const parentPath = parentNode.fullPath ? `${parentNode.fullPath}/${parentNode.name}` : '';
  node.fullPath = `${parentPath}/${node.name}`;
  return node;
};

// 调用 eachTree 函数
eachTree(menuTree, addFullPath);

// 打印结果
console.log(JSON.stringify(menuTree, null, 2));

在上述示例中,我们定义了一个菜单树结构数据 menuTree,并定义了一个回调函数 addFullPath,用于为每个节点添加 fullPath 属性。然后调用 eachTree 函数对树结构进行遍历,并传入回调函数。最后打印出处理后的树结构数据。

五、总结

eachTree 函数通过递归的方式实现了对树结构数据的深度优先遍历,为开发者提供了一种方便的方式来处理树结构中的每个节点。通过传入不同的回调函数,可以实现各种不同的功能,提高了代码的复用性和灵活性。


http://www.niftyadmin.cn/n/5867028.html

相关文章

C++核心指导原则: 错误处理

C Core Guidelines 整理目录 哲学部分接口(Interface)部分函数部分类和类层次结构部分枚举部分资源管理部分性能部分错误处理 E: Error handling E.1: Develop an error-handling strategy early in a design 翻译: 在设计早期制定一个错误处理策略。原因: 为确保代码的健壮…

基于物联网的家庭版防疫面罩设计与实现(论文+源码)

2.1 功能设计 本次基于物联网的家庭版防疫面罩设计采用单片机作为主控核心,利用温度检测模块、红外检测模块、风扇控制器模块、紫外线消毒模块、报警提示模块构成整个系统。在系统设计上,主要包括以下功能: (1)系统具…

机器学习数学基础:32.斯皮尔曼等级相关

斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数(Spearman’s rank - correlation coefficient),常用 ρ \rho ρ表示,是一种非参数统计量,用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…

【第五节】C++设计模式(创建型模式)-Prototype(原型)模式

目录 一、问题背景 二、 模式选择 三、讨论总结 一、问题背景 在软件开发中,有时我们需要通过已有对象来创建新对象,而不是从头开始构建。这种需求让我想起了现代制造业中的 3D 打印技术。通过扫描一个现有的物体,3D 打印机可以快速复制出…

SpringSecurity基于注解实现方法级别授权:@PreAuthorize、@PostAuthorize、@Secured

Spring Security 访问权限系列文章: 《SpringSecurity基于配置方法控制访问权限:MVC匹配器、Ant匹配器》 《SpringSecurity基于注解实现方法级别授权:@PreAuthorize、@PostAuthorize、@Secured》 《SpringSecurity设置白名单》 方法调用授权的含义很明确,与 HTTP 端点级别的…

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题,多层循环、分支语句练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题,多层循环、分…

Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现

Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作,使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案&#xff0…

【RK3588嵌入式图形编程】-SDL2-构建交互式按钮

构建交互式按钮 文章目录 构建交互式按钮1、回顾UI组件2、创建按钮类3、鼠标悬停事件4、处理点击事件5、创建派生按钮6、扩展功能6.1 禁用和启用按钮6.2 鼠标悬停反应7、总结在本文中,将探索构建响应用户输入的UI组件的技术。 在本文中,我们将学习如何使用SDL在C++中构建交互…