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:在初始化函数中调用递归函数来剔除目标节点及其子节点。
相关推荐
Cachel wood8 分钟前
hands-on-modern-rl:动手学强化学习策略梯度reinforce
开发语言·python
蓝斯49721 分钟前
一碰即传,重构跨设备文件分享体验
开发语言·python·重构
宁风NF24 分钟前
JavaScript:内存、垃圾回收、性能优化
开发语言·前端·javascript·学习·性能优化·es6
ShuiShenHuoLe1 小时前
Go html/template 使用入门
开发语言·golang·html
geovindu1 小时前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法
午安~婉1 小时前
挑战二:博客预览卡片
前端·javascript·html
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
星核0penstarry1 小时前
DeepSeek-V4-Flash 正式公测:大模型行业进入「极速平价普惠时代」
java·开发语言·人工智能
老洋葱Mr_Onion1 小时前
【C++】高精度模板
开发语言·c++·算法