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

JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)

大家好,今天我要分享的是如何在树形结构的数据中,根据特定条件设置节点及其所有子节点的显示属性。在实际项目中,这种需求非常常见,特别是在需要动态展示和隐藏节点的情况下。下面我将通过一个具体的示例来讲解实现过程。

需求分析

假设我们有一个树形结构的数据,如下所示:

 const treeData = [{name: "父节点1",id: 1,children: [{name: "子节点1-1", id: 11, children: [{name: "酸菜", id: 111, children: [{ name: "豆芽", id: 1111, }]}, { name: "豌豆", id: 12, }]},{ name: "子节点1-2", id: 13 }]},{name: "父节点2",id: 2,children: [{ name: "子节点2-1", id: 22, },{name: "子节点2-2",id: 23,children: [{ name: "子节点2-2-1", id: 24 }]}]}];

我们的需求是:当输入一个文本时,找到所有name属性包含该文本的节点,并将这些节点及其所有子节点和所有父节点的show属性设置为true

实现步骤

  1. 初始化节点显示属性

    在开始遍历之前,我们需要将所有节点的show属性初始化为false。这可以通过递归遍历实现。

  2. 递归遍历树形结构

    我们编写一个递归函数traverse,用于遍历树形结构。当找到包含特定文本的节点时,我们需要将该节点及其所有子节点和所有父节点的show属性设置为true

  3. 设置子节点显示属性

    为了实现这一功能,我们添加了一个内部函数setChildrenTrue,该函数递归地将所有子节点的show属性设置为true

代码实现

以下是实现上述需求的完整代码:

function setSearchText(text) {// 初始化所有节点的show属性为falsefunction setFalse(node) {node.show = false;if (node.children) {node.children.forEach(child => setFalse(child));}}// 递归遍历树形结构并设置节点及其子节点和父节点的show属性function traverse(node, parent) {if (node.name.includes(text)) {node.show = true;parents.forEach(parent => {parent.show = true;});function setChildrenTrue(child) {child.show = true;if (child.children) {child.children.forEach(grandChild => setChildrenTrue(grandChild));}}if (node.children) {node.children.forEach(child => setChildrenTrue(child));}} else if (node.children) {node.children.forEach(child => traverse(child,[...parents, node]));}}// 遍历树之前先设置所有节点的show属性为falsetreeData.forEach(node => setFalse(node));// 从根节点开始遍历treeData.forEach(node => {traverse(node, []);});
}// 示例:设置包含"酸菜"的节点及其所有子节点和父节点的show属性为true
setSearchText("酸菜");console.log(treeData);

 用于树形节点过滤筛选

通过以上代码,我们成功实现了在树形结构数据中根据特定条件设置节点及其所有子节点的显示属性,通过遍历treeData,生成对应的ul和li,并根据show属性隐藏或显示,就能通过input输入框实现树结构的节点过滤啦

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • jQuery 简介 ③ ready()事件函数、jQuery 二个原则及容错机制
  • 关系型数据库,NoSQL和内存数据库三种数据库的比较
  • nvm node管理工具常用指令
  • 大数据时代的等保测评:数据安全与隐私保护
  • 数据结构(Day14)
  • k8s自动清理pod脚本分享
  • netty编程之基于websocket发送二进制数据
  • 案例精选 | 聚铭助力河北省某市公安局筑牢网络安全防护屏障
  • Python计算机视觉编程 第十章 OpenCV
  • 2024考研数学真题解析-数二:
  • 图的应用(拓扑排序)
  • Linux:Bash中的文件描述符
  • C语言 | Leetcode C语言题解之题409题最长回文串
  • 深入分析几个难以理解的Comparator源码
  • 心觉:小时候常听到的这些教导,正在禁锢你的人生,该翻身了
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 0x05 Python数据分析,Anaconda八斩刀
  • magento2项目上线注意事项
  • Object.assign方法不能实现深复制
  • Redis 懒删除(lazy free)简史
  • vue自定义指令实现v-tap插件
  • Webpack 4x 之路 ( 四 )
  • 程序员最讨厌的9句话,你可有补充?
  • 关于使用markdown的方法(引自CSDN教程)
  • 精彩代码 vue.js
  • 前端代码风格自动化系列(二)之Commitlint
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 因为阿里,他们成了“杭漂”
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • C# - 为值类型重定义相等性
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​zookeeper集群配置与启动
  • #APPINVENTOR学习记录
  • #NOIP 2014# day.2 T2 寻找道路
  • #微信小程序(布局、渲染层基础知识)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)Jupyter Notebook 下载及安装
  • (2.2w字)前端单元测试之Jest详解篇
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (回溯) LeetCode 77. 组合
  • (面试必看!)锁策略
  • (一)WLAN定义和基本架构转
  • (源码分析)springsecurity认证授权
  • (转)详解PHP处理密码的几种方式
  • .NET : 在VS2008中计算代码度量值
  • .NET Project Open Day(2011.11.13)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET开发者必备的11款免费工具
  • .NET学习教程二——.net基础定义+VS常用设置