为什么我的递归循环在最后一次打印最后一个值两次?

时间:2019-07-14 17:39:04

标签: javascript arrays recursion

我试图递归地遍历目录中带有子目录的多个文件,以寻找匹配的对象属性。

但是,当我实际执行递归循环时,似乎无法获得理想的结果,并且由于某种原因,似乎我两次打印了最后一个调试日志。

有人可以告诉我发生了什么事吗?

 data = { myFile: { new: { name: 'new' } } }

  recursiveLoop(data, name) {
      let myArr = ['one'];
      console.log(1);
      for (const value of Object.values(data)) {
          console.log(2);
          if (value.name) {
              console.log(3);
              if (value.name === name) {
                  console.log(4);
                  myArr.push('value.name');
              }
          } else {
              console.log(5);
              recursiveLoop(value, name);
          }
      }
      console.log(6);
      return myArr;
  };

  x = recursiveLoop(data, 'new');
  console.log(x);

调试控制台日志显示为:

1
2
5
1
2
3
4
6
6

最后打印的数组为空...

我不知道出了什么问题:-(

我的目标是拥有一个数组:['new']

这是其中的stackblitz

2 个答案:

答案 0 :(得分:3)

有两个电话@ComponentScan({"com.ibm.*"}) @SpringBootApplication public class SBApplication { public static void main(String[] args) { SpringApplication.run(SBApplication.class, args); } }

  1. “主要”人:recursiveLoop
  2. “递归”代码:recursiveLoop(data, 'new');(从日志输出中只能看到一次)

由于有两次调用,并且只有一种从函数返回的方法,因此recursiveLoop(value, name);被调用两次。

答案 1 :(得分:0)

定义recursiveLoop(data, name, depth)(您将需要第三个参数),将其称为

x = recursiveLoop(data, 'new', 0);

首先,然后始终通过调用来增加它

recursiveLoop(value, name, depth + 1);

,您将始终知道它是否是第一个电话。然后将运行两次的行更改为

if (!depth) console.log(6);

因此它将仅在第一次运行。您的另一个错误是您将value.name作为字符串添加到了数组中,而不是作为值添加到了数组中,因此请更改此行

myArr.push('value.name');

myArr.push(value.name);