当前位置: 首页 > news >正文

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

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

我的数据大致是这样的:

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() {// 需要剔除的节点IDconst 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:这个函数会检查每个节点,如果节点的 nodeid 或 parentid 为目标节点ID,则将该节点及其子节点一并删除。
  2. 递归调用:在删除当前节点后,更新索引(i--),以便继续检查下一个元素。这样可以确保不会跳过任何元素。
  3. 初始化函数 initUserTreeData:在初始化函数中调用递归函数来剔除目标节点及其子节点。
http://www.lryc.cn/news/463995.html

相关文章:

  • javayufa
  • 软考-高级系统分析师知识点-补充篇
  • JavaScript全面指南(四)
  • 2024年诺贝尔物理学奖的创新之举
  • FileLink内外网文件交换——致力企业高效安全文件共享
  • 使用Python在Jupyter Notebook中显示Markdown文本
  • G1 GAN生成MNIST手写数字图像
  • WPFDeveloper正式版发布
  • 实现鼠标经过某个元素时弹出提示框(通常称为“工具提示”或“悬浮提示”)
  • 【GAMES101笔记速查——Lecture 17 Materials and Appearances】
  • 对于从vscode ssh到virtualBox的timeout记录
  • 鸿蒙原生应用扬帆起航
  • 《计算机视觉》—— 表情识别
  • NVIDIA Aerial Omniverse
  • QT程序报错解决方案:Cannot queue arguments of type ‘QTextCharFormat‘ 或 ‘QTextCursor‘
  • MySQL知识点_03
  • leetcode:744. 寻找比目标字母大的最小字母(python3解法)
  • 2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析
  • 整理一下实际开发和工作中Git工具的使用 (持续更新中)
  • Axios 的基本使用与 Fetch 的比较、在 Vue 项目中使用 Axios 的最佳实践
  • Dockerfile样例
  • MYSQL-多表查询
  • MySQL改密码后不生效问题
  • 15分钟学Go 第1天:Go语言简介与特点
  • UDP/TCP协议
  • gitee建立/取消关联仓库
  • 在 Windows 环境下,Git 默认会自动处理 CRLF 和 LF 之间的转换。
  • Kibana可视化Dashboard如何基于字段是否包含某关键词进行过滤
  • 架构师之路-学渣到学霸历程-23
  • 怎么修改编辑PDF的内容,有这4个工具就行了。