Javascript递归在遍历整个树之前完成

Javascript recursion completes before traversing the whole tree?

本文关键字:递归 遍历 Javascript      更新时间:2023-09-26

我正在做一个项目,其中一个练习要求遍历下面的数据结构并返回包含所有文件(即*.js, *.css)的数组:

var fileData = {
  dir : 'app',
  files : [
    'index.html',
    {
      dir : 'js',
      files: [
        'main.js',
        'app.js',
        'misc.js',
        {
          dir : 'vendor',
          files : [
            'jquery.js',
            'underscore.js'
          ]
        }
      ]
    },
    {
      dir : 'css',
      files : [
        'reset.css',
        'main.css'
      ]
    }
  ]
};

我想出了一个递归的解决方案,这样当你用参数fileData调用listFiles时,它应该返回所需的数组:

function listFiles(data) {
  var retval = [];
  var files;
  (function crawl(filedata) {
    files = filedata.files;
    if (typeof files !== 'undefined') {
      for (var i = 0; i < files.length; i++) {
        if (typeof files[i] === 'string') {
          retval.push(files[i]);
        } else {
          crawl(files[i]);
        }
      }
    }
  })(data);
  return retval;
}

然而,当运行代码时,它只返回*.js。这意味着在目录app中,我的程序应该遍历所有三个元素,但在第二个递归调用之后,它不会去检查第三个(/css)。有人能解释一下原因吗?非常感谢!

需要将files变量设置为递归函数的局部变量。否则,当您递归时,您将覆盖调用者中使用的值。

function listFiles(data) {
  var retval = [];
  (function crawl(filedata) {
    var files = filedata.files;
    if (typeof files !== 'undefined') {
      for (var i = 0; i < files.length; i++) {
        if (typeof files[i] === 'string') {
          retval.push(files[i]);
        } else {
          crawl(files[i]);
        }
      }
    }
  })(data);
  return retval;
}