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

如何无循环递归遍历带children的JSON数组?递归函数异常排查

如何无需嵌套循环递归遍历JSON树并生成类文件结构输出?

嘿,我一眼就看出你写的递归函数问题出在哪了!你在遍历子节点的for循环里用了return,这会导致函数处理完第一个子节点就直接返回,剩下的子节点根本没机会被遍历到。而且其实完全不需要额外传递children参数,我们可以直接从当前节点的children属性入手,还能顺便处理层级缩进,生成你想要的类文件结构输出。

原函数的核心问题

  1. 循环被提前终止:for循环里的return this.iterateTree(...)会让函数在处理第一个子节点后立刻退出,后续子节点全部被跳过,这就是你遗漏内容的直接原因。
  2. 冗余参数传递:没必要单独传children,直接使用node.children就可以访问当前节点的子节点。
  3. 缺少层级控制:没有处理节点的层级关系,没法生成带-缩进的类文件结构。

修正后的递归实现

我们给递归函数加一个level参数来记录当前节点的层级,以此生成对应的缩进前缀,同时用forEach遍历所有子节点(避免return中断循环):

iterateTree(node, level = 0) {
  // 根据层级生成前缀:根节点无前缀,子节点按层级添加'-'
  const prefix = level > 0 ? '-'.repeat(level) + ' ' : '';
  console.log(`${prefix}${node.name}`);
  
  // 遍历所有子节点,层级+1后递归处理
  if (node.children && node.children.length > 0) {
    node.children.forEach(child => {
      this.iterateTree(child, level + 1);
    });
  }
}

简化后的调用逻辑

不用自己写for循环,直接用数组的forEach方法遍历整个样本数组:

sample.forEach(node => {
  this.iterateTree(node);
});

运行效果

执行这段代码后,就会输出你期望的类文件结构:

hello world

  • fruits
  • vegetables
  • meats
    -- pork
    -- beef
    -- chicken
    --- organic
    --- farm raised
    second folder
    third folder
  • breads
  • coffee
    -- latte
    -- cappucino
    -- mocha

为什么这样可行?

  • 用forEach遍历子节点,不会因为return中断循环,确保每个子节点都被递归处理。
  • level参数精准控制层级缩进,完美匹配你要的输出格式。
  • 递归逻辑清晰,没有多余的循环嵌套,完全符合你的需求。

内容的提问来源于stack exchange,提问作者fes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:30:15