js树结构--过滤数据(查找,筛选)

Java递归实现树结构遍历展示以及条件筛选 阅读详情

树结构过滤(查找)数据,父级一起带出来。

搜索到的结果 

树形结构数据的高效过滤与父级关联方案 

问题场景:树形数据的智能搜索

在实际开发中,我们经常需要处理树形结构数据的搜索过滤,并且要求能够同时返回匹配节点及其所有父级节点。这种需求在文件系统、组织架构、分类目录等场景中十分常见。本文将深入分析一个树形数据过滤方案,并提供多种优化思路。

基础实现方案分析

直接上代码。。。。

/**
   * @author 过滤数据
   * @param {*} value
   * @param {*} arr
   * @return {*} []
   */
  const TreeDataList = (value:any = '', arr:any) => {
    if (!arr) {
      return []
    }
    let newList:any[] = [];
    arr.forEach((item:any) => {
      if (item.title1.indexOf(value) > -1) {
        const Children = TreeDataList(value, item.children);
        const obj = {
          ...item,
          children: Children
        }
        console.log(item,obj,Children);
        newList.push(obj);
      } else {
        if (item.children && item.children.length > 0) {
          const Children = TreeDataList(value, item.children);
          const obj = {
            ...item,
            children: Children
          };
          if (Children && Children.length > 0) {
            newList.push(obj);
          }
        }
      }
    });
    return newList;
  };

当前实现特点:

  1. 递归遍历树形结构

  2. 匹配包含关键词的节点(title1)

  3. 自动保留有效子节点的父级

  4. 返回保持原有结构的新树

优化方案一:性能提升版

const filterTree = (keyword = '', treeData = []) => {
  if (!treeData.length) return [];
  
  return treeData.reduce((result, node) => {
    // 检查当前节点是否匹配
    const isMatch = node.title1.includes(keyword);
    
    // 递归处理子节点
    const children = filterTree(keyword, node.children || []);
    
    // 如果当前节点匹配或有匹配的子节点,则保留该节点
    if (isMatch || children.length) {
      result.push({
        ...node,
        children: children.length ? children : undefined
      });
    }
    
    return result;
  }, []);
};

优化点:

  1. 使用reduce替代forEach,减少中间变量

  2. 简化条件判断逻辑

  3. 使用includes替代indexOf,语义更清晰

  4. 空子节点设为undefined而非空数组,减少内存占用

优化方案二:支持多字段搜索

const filterTreeAdvanced = (
  keyword = '', 
  treeData = [],
  searchFields = ['title1', 'title2', 'code']
) => {
  return treeData.filter(node => {
    // 检查当前节点是否匹配任意搜索字段
    const isNodeMatch = searchFields.some(
      field => node[field]?.toString().includes(keyword)
    );
    
    // 递归处理子节点
    const matchedChildren = filterTreeAdvanced(
      keyword, 
      node.children || [], 
      searchFields
    );
    
    // 保留当前节点条件
    return isNodeMatch || matchedChildren.length;
  }).map(node => ({
    ...node,
    children: filterTreeAdvanced(keyword, node.children || [], searchFields)
  }));
};

增强功能:

  1. 支持多个字段的搜索

  2. 自动处理字段值为非字符串的情况

  3. 更简洁的函数式编程风格

优化方案三:非递归实现(避免栈溢出)

const filterTreeIterative = (keyword, treeData) => {
  const stack = [...treeData.map(node => ({ node, parent: null }))];
  const result = [];
  
  while (stack.length) {
    const { node, parent } = stack.pop();
    
    const isMatch = node.title1.includes(keyword);
    let shouldKeep = isMatch;
    
    // 处理子节点
    const children = (node.children || []).map(child => ({
      node: child,
      parent: node
    }));
    
    // 如果有匹配的子节点,当前节点也需要保留
    const hasMatchingChildren = children.some(
      ({ node: child }) => child.title1.includes(keyword)
    );
    shouldKeep = shouldKeep || hasMatchingChildren;
    
    if (shouldKeep) {
      const newNode = { ...node, children: [] };
      if (parent) {
        parent.children.push(newNode);
      } else {
        result.push(newNode);
      }
    }
    
    // 将子节点压入栈中
    stack.push(...children);
  }
  
  return result;
};

优势:

  1. 使用迭代替代递归,避免栈溢出风险

  2. 显式处理父子关系,逻辑更清晰

  3. 适合处理深度很大的树结构

性能对比

方案优点缺点适用场景
基础递归实现简单性能一般,可能栈溢出小规模数据
优化递归代码简洁仍存在递归风险中等规模数据
多字段搜索功能强大性能开销稍大需要多字段搜索
迭代实现无栈溢出风险代码较复杂超深树结构

最佳实践建议

  1. 数据规模考虑:

    • <1000节点:递归方案即可

    • 1000节点:考虑迭代实现

  2. 搜索体验优化:

    • 添加防抖处理(300ms)

    • 支持模糊搜索(考虑正则表达式)

    • 高亮显示匹配内容

总结

树形数据的过滤搜索是一个常见但具有挑战性的需求。本文从基础实现出发,逐步介绍了多种优化方案,每种方案都有其适用场景。在实际项目中,建议:

  1. 根据数据规模选择合适算法

  2. 考虑添加缓存机制优化重复搜索

  3. 做好错误处理和性能监控

  4. 在用户体验和性能之间取得平衡

希望这些方案能为你的树形数据搜索需求提供有价值的参考!

"敏感词过滤"了解一下? "敏感词过滤"了解一下?引言字符串匹配?暴力匹配?KMP?字典树 引言 如果说项目中有用户输入的内容,那么大家肯定会需要敏感词过滤,那么大家项目中的敏感词都是怎么过滤的呢? 例如这里有这些敏感词 "java",“python”,“go”,“js”,"c++" ,那么怎么从下面的句子中过滤出这个敏感词呢? "I want to learn ja java, python, js, c++.ja" 字... 阅读详情

相关推荐

【Dv2Admin】数据单字段多选进行数据过滤

通过本文的介绍,可以看到如何在Django-vue-admin框架中实现多选过滤功能。通过自定义过滤方法和前后端的协作,系统能够处理复杂的多条件数据筛选需求。这不仅提升了用户体验,也大大提高了数据检索的效率。在教育管理系统中,这种多选搜索功能非常有价值,因为它允许用户根据多种条件快速筛选学生信息。这种灵活的过滤方式不仅适用于教育系统,也可广泛应用于其他需要处理大量数据的领域。

Mr数据杨 1208

树型数据筛选实现方案-Java

1、人员根据身份的不同对部门有不同的权限。1、根据条件,标注好每个节点的权限信息。3、递归数据,删除不需要展示的节点。2、前端请求对树节点进行筛选。

MinisterOL的博客 900

JavaScript实现扁平数组与树结构的相互转换

在解决扁平数组与树结构之间的转换问题时,关键在于识别父子关系并通过建立索引或映射结构进行层次遍历,以实现数据的转换。

快来一起学习前端知识把!加油,前端人 149

Java树形结构筛选

Java树形筛选算法 提示:使用递归方法,个人在项目中有使用到,有问题希望指出: 使用场景:当我们得到一个树形结构数据时,可能需要在树形结构上对数据进行筛选,例如通过文件夹(文件)名称模糊查询相关的文件夹并展现其父级。 缺点:需要查询出完整的树形结构才能用作筛选,在数据量非常庞大的时候并不适用。 一、话不多说直接上代码块 代码如下: import com.alibaba.fastjson.JSON; import lombok.Data; import java.util.ArrayList; import

cyunwli的博客 4031

基于JavaScript的ztreeFilterDemo:快速实现树形数据的输入搜索功能

ztreeFilterDemo是一款基于zTree组件开发的树形控件搜索与过滤功能的演示程序。该程序不仅展示了如何在复杂的树结构数据中快速检索特定节点,还提供了丰富的过滤机制以满足用户对于搜索结果的精确筛选需求。事件驱动编程是一种编程范式,其中程序的流程是由用户或系统触发的事件来决定的。在事件驱动模型中,程序在等待事件发生时处于被动状态,一旦事件发生,程序会有一个反应,通常称为回调函数或事件处理程序。在Web开发中,事件驱动编程允许开发者以模块化的方式响应用户的交互,如点击、按键、鼠标移动等。

weixin_42103128的博客 331

java-根据过滤条件显示树形结构

java根据过滤条件显示树形结构,其中包括所需要的jar包

list转Tree和手动过滤TreeNode

【代码】list转Tree和手动过滤TreeNode。

陆仁丶的博客 670

halcon 深度学习标注_Halcon deep learning之目标检测笔记(一)

设置输入输出的路径输入路径有两个,一个是图像路径HalconImageDir,一个是Json文件路径PillBagJsonFile。这两个参数用于后续在图像路径中读取coco文件。输出路径首先定义一个新的文件夹路径,用于存放样本和模型文件等数据。设置基于深度学习的目标检测模型的路径,该模型文件以.hdl结尾。设置样本数据文件夹ExampleDataDir:'detect_pills_data'数据...

weixin_27885313的博客 2700

js用递归遍历多维数组_JavaScript树结构操作:查找、遍历、筛选、树结构和列表结构相互转换...

经常有同学问树结构的相关操作,也写了很多次,在这里总结一下JS树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。本文内容结构大概如下:一、遍历树结构1. 树结构介绍JS中树结构一般是类似于这样的结构:let 为了更通用,可以用存储了树根节点的列表表示一个树形结构,每个节点的children属性(如果有)是一颗子树,如果没有children属性或者children长度为0,则表示该节点为叶子节...

weixin_39595271的博客 1418

Android手机免root玩转Kali NetHunter:Termux保姆级安装指南(附Kex VNC配置)

本文提供了一份详细的Android手机免root安装Kali NetHunter的保姆级指南。通过使用Termux终端模拟器,用户无需解锁Bootloader或获取root权限,即可在普通安卓设备上部署完整的Kali Linux渗透测试环境。教程涵盖了从环境准备、NetHunter核心安装到配置Kex VNC实现图形桌面访问的全过程,并附带了电脑投屏与常见问题解决方案,旨在打造一个便携的移动安全学习与测试平台。

weixin_29208327的博客 299

RC电路(一):微分|积分

的取值不同,会导致输出波形和输入波形之间的关系也不同,由此也会产生不同的应用。输出为0,随着电容充满电,运放-输入端得到的分压为正最大值,可等效成一个电压源,且电压不可突变,此时电流反向为最大值,开始充电时的容抗为0,电压不可突变则电压差为0,运放。开始充电时的容抗为0,电压不可突变则电压差为0,运放。输入端得到的分压也不可突变,随着电容放完电,于是。,因电容上电压不能突变(来不及充电,相当于短路,由上分析可得积分运算电路中,输出为运放的负最大峰值,随着电容充满电,输出为运放的正最大峰值,随着电容放完电,

既有随处可栖的江湖,也有追风逐梦的骁勇! 1万+

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换

来源 |https://wintc.top/article/20经常有同学问树结构的相关操作,也写了很多次,在这里总结一下JS树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。本...

web前端开发 1637

【数字人实战】Windows系统下Fun-CosyVoice3-0.5B-2512本地部署的避坑指南与疑难解析

本文详细介绍了在Windows系统下本地部署Fun-CosyVoice3-0.5B-2512的避坑指南与疑难解析,包括Python环境准备、源码获取、依赖安装、模型下载与WebUI启动等关键步骤。特别针对Windows环境下的常见问题提供了实用解决方案,帮助开发者高效完成部署并充分利用其语音转换与多语言支持功能。

weixin_42521856的博客 376

js list遍历_JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换

经常有同学问树结构的相关操作,也写了很多次,在这里总结一下JS树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。本文内容结构大概如下:一、遍历树结构1. 树结构介绍JS中树结构一般是类似于这样的结构:let tree = [ { id: '1', title: '节点1', children: [ { id: '1-1', title...

weixin_39579726的博客 892

Fluent新手必看:如何正确解读scaled residuals曲线(附常见问题排查)

本文详细解析了Fluent中scaled residuals曲线的解读方法及常见问题排查技巧。针对continuity残差居高不下、湍流模型收敛困难等典型问题,提供了网格质量检查、边界条件验证和求解策略调整的实用解决方案,帮助CFD新手快速掌握计算收敛性的关键判断标准。

weixin_28698059的博客 377

基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例

以下是一个基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例。这个系统使用langchain库进行文档处理、检索,以及与大语言模型交互。

max500600的博客 743

JS筛选多层树结构数据

当有以下数据需要前端根据name属性筛选,需要同时返回包含name的上下级 const treeData=[ { name:'一年级', id:'one', children:[ { name:'一年1班', id:'one-one', children:[ { name:'小明1', id:'XiaoMing1' }, ...

weixin_46196628的博客 1149

【数据分享】12.5米分辨率DEM地形数据(分省)

该数据来源于NASA地球科学数据网站(https://nasadaacs.eos.nasa.gov/),是ALOS卫星获取的高精度地形数据。该数据由于精度高,包括全省范围的数据和省内每个城市范围的数据!

JData_Engineer的博客 2171

js 树结构数据的递归操作

一般用于因后端给的数据字段不够完善,类型不正确,需要前端进行处理树数据。一般用于手动设置vue/react的UI库中的树的展开节点。一般用于前端做树的查询功能。

良_123的专栏 3000

第十二段:基于env的重用

现代芯片的验证通常分为两个层次, 一是模块级别( block level, 也称为IP级别、 unit级别) 验证, 二是芯片级别( 也称为SOC级别) 验证。 一个大的芯片在开发时, 是分成多个小的模块来开发的。 每个模块开发一套独立的验证环境, 通常每个模块有 一个专门的验证人员负责。 当在模块级别验证完成后, 需要做整个系统的验证。 假设某个系统分成了三个模块,如下图: 这三个模块在模块级别验证时, 分别有自己的driver和s...

年糕的博客 423

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

树型数据筛选,过滤,和查找某一个,从树型数据中把所有的子节点取出来

树结构的数据筛选 const filters = (e: any) => { let { value } = e.target; let d = JSON.parse(JSON.stringify(treeDataOld)); let datax = filtersX(value, d); setTreedata(datax); }; const filtersX = (val: any, data: Array<any>) => {

weixin_43933139的博客 3547

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

bootstrap-treeview根据条件过滤相关数据

t对需要数据进行分析 需要过滤的数据是一个数组,该数组中每条数据都是由name$$ID$$parentID$$status$$type,需要实现根据相关状态值进行筛选,筛选完成后,对于没有叶子结点的分类菜单,需要移出,不在树上展示。 name ID parentID status type 该条数据名称 该条数据Id号 该条数据的父ID 数据的状态(共四种) 数据的分类(1表示菜单,0表示叶子结点) 思路分析 经过对数据的分析,可以看出来这些记录组成的数据是一种逻辑上的链表结构,由叶子结

heromps的博客 784

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js中树结构根据条件查找节点返回节点路径的一些思路

  今天在项目中遇到一个问题,需要根据数据库中记录的树结构节点id获取该记录所在目录节点的路径。   大致想法,首先定义变量保存当前路径,然后递归遍历该树节点,在遍历的过程中将遍历到的节点加入到当前路径中,找到该节点后终止递归,最后返回路径即可。   问题,怎样保存当前判断节点的路径以及未找到节点时对路径的处理方法。   现附上代码: var getPathById = function (id, catalog, callback) { //定义变量保存当前结果路径 var tempp

liudanyang_21的博客 1429

vue根据关键字查找树结构

  话不多说,先看效果 需求描述:需要根据关键字找出对应的父结构,简单讲就是搜索树的叶子节点,然后把对应的那个枝干也展现出来,当然枝干也可以搜索,搜索枝干的话就把搜索到的枝干作为叶子节点,优先级为叶子节点大于中间节点(中间节点和叶子节点都有关键字时,以搜索叶子节点为结果) 数据源 data() { //这里存放数据 return { searchKey:undefined, arr:[], sourceArr: [ { cid: 1, name: "父"

Lalo的博客 3586
上一篇: vscode编辑器快捷键
下一篇: Draggable拖拽+Collapse使用(不一样的手风琴)
fineworkmanship
博客等级 码龄6年 7粉丝 20原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值