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

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

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

相关文章:

  • Java 大视界 -- 深入剖析 Java 大数据实时 ETL 中的数据质量保障策略(97)
  • GMII(Gigabit Media Independent Interface)详解
  • 登录-10.Filter-登录校验过滤器
  • Docker 2025/2/24
  • 互联网上门洗衣洗鞋小程序
  • Python+Flutter前后端分离开发跨平台待办事项APP实战
  • 微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果
  • R 语言科研绘图 --- 柱状图-汇总
  • CSS编程基础学习
  • 每日一题——顺时针旋转矩阵
  • 基于 GEE 计算并下载研究区年均叶面积指数 LAI 和光合有效辐射分量 FPAR
  • 量子计算在金融风险评估中的应用:革新与突破
  • dify本地部署
  • Python--函数高级(上)
  • tauri输入js脚本的方法和注意事项initialization_script
  • 什么是MySql的主从复制(主从同步)?
  • 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-Docker助力-模型部署 “光速” 指南
  • MySQL-数据库的基本操作
  • 我与Linux的爱恋:了解信号量+共享内存+消息队列的应用
  • zookeeper 客户端常用命令
  • 家用电脑搭建网站/百度下载app下载
  • 丰台seo网站关键词优化/网络推广外包公司
  • 台湾网站建设公司/哪家网络公司比较好
  • 留言板网站怎么做/北京做seo的公司
  • 购买的网站怎么看网站空间大小/关键词搜索工具有哪些
  • 长春学校网站建设方案咨询/南昌企业网站建设