JS通过递归函数来剔除树结构特定节点

最近在处理权限类问题过程中,遇到多次需要过滤一下来列表的数据,针对不同用户看到的数据不同。记录一下

我的数据大致是这样的:

javascript 复制代码
class UserTree {
    constructor() {
        this.userTreeData = [
            // 示例数据
            { nodeid: "1", nodename: "Root", parentid: null, children: [
                { nodeid: "2", nodename: "Child 1", parentid: "1", children: [] },
                { nodeid: "3", nodename: "Child 2", parentid: "1", children: [
                    { nodeid: "67176000000000000000000000000000", nodename: "Grandchild 1", parentid: "3", children: [] },
                    { nodeid: "4", nodename: "Another Grandchild", parentid: "3", children: [
                        { nodeid: "67176000000000000000000000000001", nodename: "Great Grandchild", parentid: "67176000000000000000000000000000", children: [] }
                    ] }
                ] }
            ] }
        ];
    }

    // 递归函数来剔除特定节点以及parentid为特定值的节点
    removeNodeByIdAndParentId(tree, nodeId) {
        if (!tree || tree.length === 0) return;

        for (let i = 0; i < tree.length; i++) {
            if (tree[i].nodeid === nodeId || tree[i].parentid === nodeId) {
                tree.splice(i, 1); // 删除节点
                i--; // 更新索引以继续检查下一个元素
            } else if (tree[i].children && tree[i].children.length > 0) {
                // 递归遍历子节点
                this.removeNodeByIdAndParentId(tree[i].children, nodeId);
            }
        }
    }

    // 初始化用户树数据
    initUserTreeData() {
        // 需要剔除的节点ID
        const targetNodeId = "67176000000000000000000000000000";

        // 调用递归函数来剔除节点
        this.removeNodeByIdAndParentId(this.userTreeData, targetNodeId);

        // 继续其他初始化逻辑...
    }
}

// 测试
let userTree = new UserTree();
console.log("Before removal:", JSON.stringify(userTree.userTreeData, null, 2));
userTree.initUserTreeData();
console.log("After removal:", JSON.stringify(userTree.userTreeData, null, 2));
  1. 递归函数 removeNodeByIdAndParentId :这个函数会检查每个节点,如果节点的 nodeidparentid 为目标节点ID,则将该节点及其子节点一并删除。
  2. 递归调用 :在删除当前节点后,更新索引(i--),以便继续检查下一个元素。这样可以确保不会跳过任何元素。
  3. 初始化函数 initUserTreeData:在初始化函数中调用递归函数来剔除目标节点及其子节点。
相关推荐
进击的_鹏13 分钟前
【C++】list 链表的使用+模拟实现
开发语言·c++·链表
m0_7383556921 分钟前
java泛型
java·开发语言
大模型铲屎官37 分钟前
哈希表入门到精通:从原理到 Python 实现全解析
开发语言·数据结构·python·算法·哈希算法·哈希表
十步杀一人_千里不留行1 小时前
React Native 下拉选择组件首次点击失效问题的深入分析与解决
javascript·react native·react.js
L_09071 小时前
【C】队列与栈的相互转换
c语言·开发语言·数据结构
qq4054251971 小时前
基于python的旅客游记和轨迹分析可视化系统设计(新)
开发语言·python
C#Thread1 小时前
C#上位机--进程和线程的区别
java·开发语言
DKPT1 小时前
计算机网络之路由协议(自治系统)
开发语言·笔记·学习·计算机网络·算法
水月梦镜花2 小时前
数据结构:基数排序(c++实现)
开发语言·数据结构·c++
m0_594526302 小时前
基于 PyQt5 实现分组列表滚动吸顶效果
开发语言·python·qt