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

embedded/2024/9/22 18:04:03/

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

需求分析

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

javascript"> 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

代码实现

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

javascript">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输入框实现树结构的节点过滤啦

treeSkill">

http://www.ppmy.cn/embedded/114397.html

相关文章

基于SpringBoot的校园失物招领系统

文未可获取一份本项目的java源码和数据库参考。 课题的研究和意义: 在各大高校中,尽管现在信息化发展越来越迅速,手机电脑也几乎普及到了每一位学生中,但是部分学校仍然使用传统的失物招领管理方法,它们通常设立一个失物存放处,在固定的时间…

mac os x 找不到钥匙串访问

昨天手贱更新了最新的mac系统,结果在实用工具中找不到钥匙串访问APP了。。。 最新mac系统为 15.0 (24A335) 真是醉了。。。 那就得想办法把他给呼出来,在开发者中心下载了一个.cer文件,然后双击打开,此时钥匙串打开了&#xff…

『 Linux 』协议的定制

文章目录 协议的概念序列化和反序列化网络计算器套接字接口的封装服务端大致框架协议的定制Request的序列化与反序列化Response的序列化与反序列化报头的封装的解包网络服务服务端的封装已提取报文的移除客户端的封装客户端的调用服务端接收多个请求 JSON 自动序列化反序列化使…

修改Git配置信息:用户名

在Git中,用户名(user.name)和邮箱地址(user.email)是用于识别Git操作(如提交)的标识信息。如果你需要修改Git用户名,你可以通过Git命令行界面来修改这个设置。以下是具体的步骤&…

【busybox记录】【shell指令】timeout

目录 内容来源: 【GUN】【timeout】指令介绍 【busybox】【timeout】指令介绍 【linux】【timeout】指令介绍 使用示例: 例子1 例子2 例子3 例子4 常用组合指令: 指令不常用/组合用法还需继续挖掘: 内容来源&#xff1…

bprc二次封装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、封装的思想二、封装单个服务的信道管理类1.成员变量2.成员函数 三、封装总体的服务信道管理类1.成员变量2.成员函数 四.etcd和brpc联合测试1.服务注册客户端2.服…

MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)

目录 讲解一:窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数:求和 min函数 :最小值 1.2. 排序函数 1.3. 跨行函数…

LLaMA-Factory 使用 sharegpt 格式的数据集

LLaMA-Factory 使用 sharegpt 格式的数据集 flyfish sharegpt 格式的数据集遵循的格式 [{"conversations": [{"from": "human","value": "user instruction"},{"from": "gpt","value": &q…