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

news2024/9/20 22:52:51

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

需求分析

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

 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属性为false
    function 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属性为false
    treeData.forEach(node => setFalse(node));

    // 从根节点开始遍历
    treeData.forEach(node => {
        traverse(node, []);
    });
}

// 示例:设置包含"酸菜"的节点及其所有子节点和父节点的show属性为true
setSearchText("酸菜");

console.log(treeData);

 用于树形节点过滤筛选

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(史上最全)线程池

线程池 文章目录 线程池一,前言二,线程池三,参数四,线程池的实现原理5.线程池的使用案例(自定义线程池)6.使用Executors 创建常见的功能线程池1.固定大小线程池2.定时线程3.可缓存线程池4.单线程化线程池 一,前言 虽然…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …

假期学习--iOS 编译链接

iOS 编译链接 编译流程 四步: 1.预处理 2.编译 3.汇编 4.链接 大概的步骤如下: 预处理 作为编译的第一步,将.m文件转换为.i文件 ; 预处理是要处理源代码中所有以#开头的所有预编译指令 ; 规则如下&#xff1…

更换UFS绑定固件与“工程固件”的区别 小米10s机型更换cpu绑定包对比 写入以及修复基带

目前机型的安全机制越来越高。机型cpu与字库存在绑定关系。主板cpu如损坏需要更换。换新cpu后就需要刷写底层绑定包来修复 。今天的博文将为大家带来UFS绑定包与工程固件的区别以及写入 修复基带的步骤解析 通过博文了解 1💝💝💝-----更换UFS绑定包与工程固件的区别 2…

利士策分享,赚钱与体重:一场关于生活平衡的微妙探索

利士策分享,赚钱与体重:一场关于生活平衡的微妙探索 在当今社会,赚钱与体重,这两个看似风马牛不相及的概念, 却在无形中交织着人们的生活轨迹。 它们不仅仅是数字上的增减,更是个人选择、生活方式乃至心理…

Mycat搭建分库分表

分库分表解决的问题 单表数据量过大带来的性能和存储容量的限制的问题: 索引效率下降读写瓶颈存储容量限制事务性能问题分库分表架构 再搭建一对主从复制节点,3307主节点,3309从节点配置数据源 dw1 , dr1,创建集群c1创建逻辑库 CREATE DATAB…

【AI小项目6】QLoRA针对资源受限设备上的大模型微调和文本分类任务的推理

目录 一、项目简介概述时间主要工作和收获技术栈数据集结果参考 二、训练阶段的完整代码什么是 QLoRA 微调?注意 安装库导入包配置定义一个Config类配置训练参数配置Lora 初始化分词器和模型数据预处理计算模型评估指标交叉验证划分数据集举例: 创建Trai…

Redis-分片集群

分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决: 海量数据存储问题 高并发写的问题 使用分片集群可以解决上述问题,如图: 分片集群特征: 集群中有多个master,每个master保存不同数据 每个ma…

Java-测试-Mockito 入门篇

之前很长一段时间我都认为测试就是使用SpringBootTest类似下面的写法&#xff1a; SpringBootTest class SysAuthServiceTest {AutowiredSysRoleAuthMapper sysRoleAuthMapper;Testpublic void test() {QueryWrapper<SysRoleAuth> queryWrapper new QueryWrapper<&g…

Linux命令:对文本文件的内容进行排序的工具sort详解

目录 一、概述 二、用法 1、 基本语法 2、 常用选项 3、获取帮助 三、示例 1. 基本用法 2. 按数字排序 3. 按第二列排序 4. 逆序排序 5. 删除重复行 6. 忽略大小写排序 7. 按人类可读的数值排序 8. 按版本号排序 四、高级用法 1. 与 uniq 结合使用去重 2. 与 gr…

1.使用 VSCode 过程中的英语积累 - File 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

不断挑战才有不断机遇!Eagle Trader等你来加入!

2024“Eagle Trader杯”全国职业交易联赛S1赛季已火热进行一个多月&#xff0c;吸引了超过355名交易员的积极参与&#xff01;目前&#xff0c;每天都有新的交易员踊跃报名参加&#xff01; 经过严格地交易考核&#xff0c;13名选手成功通过初试&#xff0c;正进入下一阶段的挑…

XILINX ZYNQ 7000 使用 FreeRTOS

XILINX 官方的SDK可以生成FreeRTOS 本文分为三个部分&#xff1a; 1.ZYNQ 7010 创建一个最小ZYNQ Processer系统&#xff0c;能够使用串口打印 2.使用SDK 创建一个FreeRTOS最小软件系统 3.浅析FreeRTOS最小软件系统 一&#xff1a;ZYNQ 7010 创建一个最小ZYNQ Processer系统&…

基于Linux系统离线安装oracle数据库

注意事项&#xff1a; 在安装的时候多次涉及root用户和oracle用户的切换&#xff0c;请注意区分&#xff0c;本文已明显 一、环境准备 1、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld2、 禁用NetworkManager服务&#xff08;非必须&#xff09; [rootlocalhost …

信号与线性系统实验四 离散系统的时域及变换域分析

文章目录 一、实验目的二、实验内容与原理三、实验器材四、实验步骤五、实验数据及结果分析第一部分&#xff1a;离散时间信号的时域基本运算第二部分&#xff1a; 离散LTI系统的时域分析第三部分&#xff1a;离散LTI系统Z域分析 六、实验结论七、其他(主要是心得体会) 一、实验…

通信工程学习:什么是PON无源光网络

PON&#xff1a;无源光网络 PON&#xff08;Passive Optical Network&#xff0c;无源光纤网络&#xff09;是一种采用光分路器等无源光器件进行信号传输和分配的光纤接入技术。它利用光纤作为传输媒介&#xff0c;通过无源设备将光信号从中心局&#xff08;如光线路终端OLT&am…

Linux基础4-进程1(操作系统,进程介绍,Linux进程相关命令,getpid,fork)

上篇文章&#xff1a;Linux基础3-基础工具4&#xff08;git&#xff09;&#xff0c;冯诺依曼计算机体系结构-CSDN博客 本章重点&#xff1a; 1. 操作系统简介 2. 什么是进程&#xff1f; 3. 在Linux使用命令查看进程&#xff08;ps&#xff09; 4. getpid&#xff0c;getppid,…

卷积和相关

卷积和相关是两种运算关系(或过程),都是含参变量的无穷积分。都是两个函数通过某种运算得到另外一个函数。 卷积运算: 可用来表示一个观测系统或一个观 测仪器对输入信号的作用过程等。 相关运算:常用来比较两个函数的关联性,相似程度,用于信号检测,图像识别。如:在混…

SCSAI平台面向对象建模技术的设计和实现(1)

SCSAI平台面向对象建模技术的设计和实现&#xff08;1&#xff09; 原创 团长团 AI智造AI编程 2024年09月19日 20:09 北京 用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCSAI,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现…

【jupyter notebook】环境部署及pycharm连接虚拟机和本地两种方式

Python数据处理分析简介 Python作为当下最为流行的编程语言之一 可以独立完成数据分析的各种任务数据分析领域里有海量开源库机器学习/深度学习领域最热门的编程语言在爬虫&#xff0c;Web开发等领域均有应用 与Excel&#xff0c;PowerBI&#xff0c;Tableau等软件比较 Excel有…