当前位置: 首页 > 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输入框实现树结构的节点过滤啦

http://www.lryc.cn/news/441885.html

相关文章:

  • 第二证券:金价涨了!创一历史之最!
  • maxwell 输出消息到 kafka
  • 青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
  • 单片机原理及应用
  • sql中拼接操作
  • 基于C语言+SQL Server2008实现(控制台)图书管理系统
  • Msf之Python分离免杀
  • electron-updater实现electron全量版本更新
  • Mysql梳理6——order by排序
  • Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
  • Linux操作系统 进程(3)
  • QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]
  • 代码签名证书快速申请指南
  • 安卓 uniapp跨端开发
  • 【高阶用法】uniapp的i18n多语言模块修复与增强(Typescript)
  • SQL Server Data Tools (SSDT)入门教程
  • 窗户检测系统源码分享
  • 2.计算机网络基础
  • 硬中断,软中断恢复位置
  • MySQL基础(13)- MySQL数据类型
  • 数据结构------二叉树简单介绍及实现
  • 由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(六)
  • 尚品汇-秒杀下单实现-页面轮询查询订单状态(五十三)
  • 2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology
  • 2024最新版,人大赵鑫老师《大语言模型》新书pdf分享
  • [Leetcode 543][Easy]-二叉树的直径-递归
  • 高级大数据开发学习路线指南
  • SpringBoot设置mysql的ssl连接
  • 2024-1.2.12-Android-Studio配置
  • 前端vue左侧树的一整套功能实现(一):vue2+vite封装v-resize指令,实现左侧树拖拽宽度和折叠展开