单层迭代器仅遍历当前节点的直接子节点(children),不递归深入子孙;通过手动实现symbol.iterator,支持for...of、扩展运算符等,可结合权限校验动态过滤可见子节点。

在企业级权限系统中,多叉组织架构树通常以嵌套对象或数组形式存在,而标准的 Symbol.iterator 默认只遍历第一层(如数组元素),无法天然支持“扁平化单层遍历所有节点”。要定制一个真正意义上的单层迭代器——即每次调用 next() 都返回一个直属子节点(不递归展开子孙),需手动实现 [Symbol.iterator] 并控制遍历深度为 1。
明确“单层迭代器”的语义
这里的“单层”指:仅遍历当前节点的直接子节点(children),不进入孙子及更深层。它不是 DFS/BFS 的扁平化遍历,而是对某个特定节点的 children 数组做可控、可暂停的逐项访问。
- 适用于权限校验时按层级逐步检查直属部门/角色
- 便于与
for...of、扩展运算符、生成器组合使用 - 避免一次性展开整棵树导致内存或性能问题
为组织节点类实现单层迭代器
假设组织节点结构如下:
class OrgNode {
constructor(id, name, children = []) {
this.id = id;
this.name = name;
this.children = children; // 子节点数组,每个也是 OrgNode 实例
}
*[Symbol.iterator]() {
// 只迭代 this.children,不递归
for (const child of this.children) {
yield child;
}
}
}
这样写后,任何 OrgNode 实例都支持:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
for (const dept of rootNode) { ... }—— 遍历 root 的直属部门 -
[...rootNode]—— 展开为直属子节点数组 -
Array.from(rootNode)—— 同上
支持动态过滤与条件迭代(如权限可见性)
真实场景中,并非所有子节点都对当前用户可见。可在迭代器中注入权限上下文:
class OrgNode {
// ... 构造函数同上
[Symbol.iterator](options = {}) {
const { visibleOnly = true, permissionChecker } = options;
const children = visibleOnly
? this.children.filter(node =>
permissionChecker?.(node) ?? true
)
: this.children;
let index = 0;
return {
next() {
if (index user.hasAccessTo(node.id)
});
与 Iterator 协议兼容的工具方法
若不想侵入类定义,也可封装独立迭代器工厂:
function createDirectChildrenIterator(node, options = {}) {
const { children = [] } = node;
const { filter } = options;
const items = filter ? children.filter(filter) : children;
let i = 0;
return {
next() {
return i d.status === 'active'
})) {
console.log(dept.name);
}
这种写法更灵活,适合已有不可修改的节点对象结构。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










