【前端】【面试】【功能函数】写一个JavaScript树形结构操作函数:`filter` 与 `forEach`

news/2025/2/26 22:51:30

filter__forEach_0">写一个JavaScript树形结构操作函数:filterforEach

在JavaScript开发中,处理树形结构数据是一项常见的任务。本文将详细介绍两个用于操作树形结构数据的函数:filterforEach,包括它们的功能、使用方法以及具体示例。

filter__4">1. filter 函数

1.1 功能概述

filter 函数用于过滤树形结构数据。它会遍历树形结构中的每个节点,根据传入的过滤函数 func 来决定是否保留该节点。如果节点通过过滤函数的检查,或者该节点有子节点且子节点通过过滤,那么该节点将被保留在最终结果中。

1.2 函数定义

export const filter = <T = any>(
  tree: T[],
  func: (n: T) => boolean,
  config: Partial<TreeHelperConfig> = {}
): T[] => {
  config = getConfig(config)
  const children = config.children as string
  function listFilter(list: T[]) {
    return list
     .map((node: any) => ({...node }))
     .filter((node) => {
        node[children] = node[children] && listFilter(node[children])
        return func(node) || (node[children] && node[children].length)
      })
  }
  return listFilter(tree)
}

这里,T 是树形结构节点的数据类型,默认为 anytree 是包含树形结构节点的数组,func 是用于过滤节点的函数,config 是一个可选配置对象,用于指定树形结构中表示子节点的属性名。

1.3 使用方法

  • 参数说明
    • tree: 必需,树形结构数据的根节点数组。
    • func: 必需,一个回调函数,接收一个节点作为参数,返回 truefalse,用于判断该节点是否应被保留。
    • config: 可选,配置对象,可用于指定树形结构中表示子节点的属性名,默认为 {}

1.4 示例

假设我们有如下树形结构数据,表示一个公司的部门和员工:

javascript">const companyTree = [
  { id: 1, name: '总公司', type: 'department', children: [
    { id: 2, name: '研发部', type: 'department', children: [
      { id: 3, name: '前端组', type: 'team', children: [
        { id: 4, name: '张三', type: 'employee' },
        { id: 5, name: '李四', type: 'employee' }
      ]},
      { id: 6, name: '后端组', type: 'team', children: [
        { id: 7, name: '王五', type: 'employee' }
      ]}
    ]},
    { id: 8, name: '市场部', type: 'department', children: [
      { id: 9, name: '推广组', type: 'team', children: [
        { id: 10, name: '赵六', type: 'employee' }
      ]}
    ]}
  ]
];

现在我们要过滤出所有类型为 employee 的节点:

javascript">const filteredTree = filter(companyTree, (node) => node.type === 'employee');
console.log(filteredTree);

上述代码会输出所有员工节点组成的树形结构。

forEach__66">2. forEach 函数

2.1 功能概述

forEach 函数用于遍历树形结构数据。它会对树形结构中的每个节点执行传入的回调函数 func,如果回调函数返回 true,则终止遍历,以避免在大量节点场景下的无意义循环,防止浏览器卡顿。

2.2 函数定义

export const forEach = <T = any>(
  tree: T[],
  func: (n: T) => any,
  config: Partial<TreeHelperConfig> = {}
): void => {
  config = getConfig(config)
  const list: any[] = [...tree]
  const { children } = config
  for (let i = 0; i < list.length; i++) {
    if (func(list[i])) {
      return
    }
    children && list[i][children] && list.splice(i + 1, 0,...list[i][children])
  }
}

这里,T 同样是树形结构节点的数据类型,tree 是树形结构数据的根节点数组,func 是遍历节点时执行的回调函数,config 用于指定树形结构中表示子节点的属性名。

2.3 使用方法

  • 参数说明
    • tree: 必需,树形结构数据的根节点数组。
    • func: 必需,一个回调函数,接收一个节点作为参数,返回一个值。如果返回 true,则终止遍历。
    • config: 可选,配置对象,可用于指定树形结构中表示子节点的属性名,默认为 {}

2.4 示例

还是以上述公司树形结构数据为例,我们要找到名字为 李四 的员工节点,并输出其信息:

javascript">forEach(companyTree, (node) => {
  if (node.name === '李四') {
    console.log('找到李四:', node);
    return true;
  }
});

上述代码会在遍历到名字为 李四 的节点时输出其信息,并终止遍历。

通过这两个函数,我们可以方便地对树形结构数据进行过滤和遍历操作,提高开发效率。在实际应用中,可根据具体需求灵活调整和使用。


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

相关文章

ubuntu-server 安装 navidia 显卡驱动

资料 https://juejin.cn/post/7362562720708280332 过程 ubuntu-drivers devices 选择ubuntu-server安装 rootroot:~# ubuntu-drivers devices udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwd…

水利工程安全包括哪几个方面

水利工程安全培训的内容主要包括以下几个方面&#xff1a; 基础知识和技能培训 &#xff1a; 法律法规 &#xff1a;学习水利工程相关的安全生产法律法规&#xff0c;了解安全生产标准及规范。 事故案例 &#xff1a;通过分析事故案例&#xff0c;了解事故原因和教训&#x…

当下弹幕互动游戏源码开发教程及功能逻辑分析

当下很多游戏开发者或者想学习游戏开发的人&#xff0c;想要了解如何制作弹幕互动游戏&#xff0c;比如直播平台上常见的那种&#xff0c;观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先&#xff0c;弹幕互动游戏源码开发教程部分应该分步骤&…

力扣 下一个排列

交换位置&#xff0c;双指针&#xff0c;排序。 题目 下一个排列即在组成的排列中的下一个大的数&#xff0c;然后当这个排列为降序时即这个排列最大&#xff0c;因为大的数在前面&#xff0c;降序排列的下一个数即升序。所以&#xff0c;要是想找到当前排列的下一个排列&…

读书笔记 - 重学Java设计模式

读书笔记 - 重学Java设计模式 第1章 设计模式介绍第2章 六大设计原则单一职责原则定义开闭原则定义里氏替换原则定义迪米特法则定义接口隔离原则定义依赖倒置原则定义 第3章 设计模式如何落地第4章 工厂模式工厂模式介绍模拟发放多种奖品发奖接口三种发奖接口实现优惠券实物商品…

WebRTC学习七:WebRTC 中 STUN 协议详解

系列文章目录 第一篇 基于SRS 的 WebRTC 环境搭建 第二篇 基于SRS 实现RTSP接入与WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 环境搭建 第四篇 WebRTC学习一&#xff1a;获取音频和视频设备 第五篇 WebRTC学习二&#xff1a;WebRTC音视频数据采集 第六篇 WebRTC学习三…

Postman学习总结

1、基本操作&#xff1a; 【2023全网最牛教程】10分钟快速上手Postman&#xff08;建议收藏&#xff09;_macbook postman打开慢-CSDN博客 接口测试—Postman详解-CSDN博客 新手如何使用postman&#xff08;新手使用&#xff0c;简单明了&#xff09;_postman教程-CSDN博客 …

机器学习——需求预测+PCA+随机森林算法+shap可解释性分析+多模型性能对比

1 数据集介绍 自行车共享租赁过程与环境和季节设置高度相关。例如&#xff0c;天气状况、降水、星期几、季节、一天中的小时等都会影响租赁行为。数据集特征 instant&#xff1a;记录索引 dteday&#xff1a;日期 season&#xff1a;季节&#xff08;1&#xff1a;春季&…