You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归获取MyObject全量子节点的方法偶尔失效,请求排查代码问题

问题排查与修复

核心错误分析

你的递归实现存在两个关键问题,导致偶尔丢失子节点:

  1. 直接修改原对象的children数组:代码中const children = myObject.children;是对原对象数组的引用,后续push操作会直接篡改原始树形结构。当你再次调用该方法或在其他逻辑中使用这个对象时,已经被修改的children会导致不可预期的遍历结果。
  2. 遍历与修改同一数组的冲突:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 03:10:05