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:在初始化函数中调用递归函数来剔除目标节点及其子节点。
相关推荐
小尧嵌入式4 分钟前
C++基础语法总结
开发语言·c++·stm32·单片机·嵌入式硬件·算法
@游子8 分钟前
Python学习笔记-Day2
开发语言·python
qq_336313939 分钟前
java基础-集合进阶
java·开发语言·windows
222you11 分钟前
MybatisPlus常用注解
java·开发语言·spring
你的冰西瓜22 分钟前
C++20 新特性详解:相较于 C++17 的主要改进
开发语言·c++·stl·c++20
小皮虾25 分钟前
拒绝卡顿!小程序图片本地“极速”旋转与格式转换,离屏 Canvas 性能调优实战
前端·javascript·微信小程序
汤姆Tom26 分钟前
前端转战后端:JavaScript 与 Java 对照学习指南 (第一篇 - 深度进阶版)
java·javascript
瓶子in26 分钟前
JavaScript数组去重的多种实现方式
javascript
Cassie燁28 分钟前
element-plus源码解读2——vue3组件的ref访问与defineExpose暴露机制
javascript·vue.js
Robet31 分钟前
类属性公共还是私有
javascript·typescript