递归获取MyObject全量子节点的方法偶尔失效,请求排查代码问题
问题排查与修复
核心错误分析
你的递归实现存在两个关键问题,导致偶尔丢失子节点:
- 直接修改原对象的
children数组:代码中const children = myObject.children;是对原对象数组的引用,后续push操作会直接篡改原始树形结构。当你再次调用该方法或在其他逻辑中使用这个对象时,已经被修改的children会导致不可预期的遍历结果。 - 遍历与修改同一数组的冲突:在
forEach遍历myObject.children的同时,往同一个数组中新增元素,虽然forEach不会遍历新增的元素,但递归返回的子节点数组已经被修改(因为子节点的children也被同样的逻辑篡改),这会导致部分深层节点被重复添加或遗漏。
另外,方法定义中的allObjects参数未被使用,属于冗余代码,可以移除。
修正后的实现
private getAllChildrenOf(myObject: MyObject): MyObject[] { // 创建新数组存储结果,避免修改原对象结构 const allChildren: MyObject[] = [...myObject.children]; // 遍历每个直接子节点,递归获取其所有子孙节点并添加到结果数组 myObject.children.forEach(child => { allChildren.push(...this.getAllChildrenOf(child)); }); return allChildren; }
修正逻辑说明
- 使用扩展运算符
[...myObject.children]复制直接子节点到新数组,彻底与原对象的children解耦,避免污染原始数据。 - 递归获取每个子节点的所有子孙节点,并将其追加到结果数组中,保证所有层级的子节点都能被收集到。
- 移除未使用的参数,简化方法结构。
内容的提问来源于stack exchange,提问作者ATW
相关产品推荐
相关产品推荐

