最近在处理权限类问题过程中,遇到多次需要过滤一下来列表的数据,针对不同用户看到的数据不同。记录一下
我的数据大致是这样的:
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));
- 递归函数
removeNodeByIdAndParentId
:这个函数会检查每个节点,如果节点的nodeid
或parentid
为目标节点ID,则将该节点及其子节点一并删除。 - 递归调用 :在删除当前节点后,更新索引(
i--
),以便继续检查下一个元素。这样可以确保不会跳过任何元素。 - 初始化函数
initUserTreeData
:在初始化函数中调用递归函数来剔除目标节点及其子节点。