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

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

需求分析

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

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

相关推荐
陈随易5 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js6 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC6 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
鱼樱前端6 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
_lucas6 小时前
给知识库网站接入AI问答
前端·ai编程·全栈
前端糕手7 小时前
前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化
前端
我不叫武8 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
Web4Browser9 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化
Patrick_Wilson9 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js
颜酱9 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端