<p>Generator 通过 yield 实现惰性递归扁平化,支持树、多维数组等嵌套结构;yield 自动委托给数组/Set/Map 等可迭代对象的默认迭代器,对非标准结构(如二叉树)需手动编写递归逻辑;配合 for...of 可逐项处理,避免内存压力。</p>

Generator 可以用 yield* 递归委托和 for...of 驱动,把嵌套结构(如树、多维数组、带 children 的对象)变成单层可迭代序列,不一次性展开内存,也不依赖深度限制。
用 yield* 委托子生成器处理嵌套
遇到数组、Set、Map 或自定义可迭代对象时,直接用 yield* 把控制权交给它的默认迭代器,天然支持递归扁平化。
- 对普通数组:yield* arr 就等价于逐个 yield 每一项
- 对含 children 的树节点:在生成器内部判断是否有 children 属性,有就 yield* 递归调用自身
- 对 Map/WeakMap:先取 values() 或 entries(),再 yield* 其迭代器
手动控制遍历逻辑,适配非标准结构
不是所有嵌套结构都原生可迭代。比如一个带 left/right 属性的二叉树节点,需显式写递归逻辑:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先 yield 当前节点值(中序/前序/后序按需调整)
- 如果 left 存在,yield* 该子树的生成器
- 如果 right 存在,yield* 该子树的生成器
- 这样既保持惰性,又完全可控
配合 for...of 或扩展运算符消费结果
生成器返回的是迭代器,可以直接用 for...of 遍历,或转成数组:[...flatten(tree)]。注意:扩展运算符会自动触发迭代,但会一次性收集全部值;若只想逐个处理,优先用 for...of 避免内存压力。
立即学习“Java免费学习笔记(深入)”;
- 想边读边处理(比如渲染、校验):用 for...of
- 需要随机访问或多次遍历:转成数组或 Set
- 只取前 N 项:配合 break 或用 Array.from(flatten(gen), (_, i) => i
处理环状引用和边界情况
真实数据可能有循环引用(如 parent 指针),直接递归会导致栈溢出或无限 yield。解决方式:
- 维护一个 WeakSet 记录已访问对象,遇到重复引用直接 return
- 限制最大递归深度,超限时抛错或跳过
- 对 null/undefined/原始值提前 return,避免 TypeError

















