如何无循环递归遍历带children的JSON数组?递归函数异常排查
如何无需嵌套循环递归遍历JSON树并生成类文件结构输出?
嘿,我一眼就看出你写的递归函数问题出在哪了!你在遍历子节点的for循环里用了return,这会导致函数处理完第一个子节点就直接返回,剩下的子节点根本没机会被遍历到。而且其实完全不需要额外传递children参数,我们可以直接从当前节点的children属性入手,还能顺便处理层级缩进,生成你想要的类文件结构输出。
原函数的核心问题
- 循环被提前终止:
for循环里的return this.iterateTree(...)会让函数在处理第一个子节点后立刻退出,后续子节点全部被跳过,这就是你遗漏内容的直接原因。 - 冗余参数传递:没必要单独传
children,直接使用node.children就可以访问当前节点的子节点。 - 缺少层级控制:没有处理节点的层级关系,没法生成带
-缩进的类文件结构。
修正后的递归实现
我们给递归函数加一个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
相关产品推荐
相关产品推荐

