从具有指定文件夹名称的文件夹结构中获取文件名

时间:2014-07-31 04:31:05

标签: javascript recursion

我正在尝试解决类似问题并遇到问题。 Javascript recursion completes before traversing the whole tree?

我有相同的函数listFiles但有两个参数。第二个参数是传递给此函数的文件夹名称。该函数应返回属于传递的foldername的文件名。例如。如果传递的文件夹名称是' js'然后该函数应返回5个文件,即 - main.js',' app.js',' misc.js'' jquery.js'和' underscore.js'。这是我试图编写的代码来实现结果 -

function listSubfolder(fileSystem, subFolder){
            var result = [];
            for(var i=0; i<fileSystem.files.length; i++){
                if(typeof fileSystem.files[i] !== 'string') {
                    fileSystem = fileSystem.files[i];
                    findFiles(fileSystem);
                }
            }

        function findFiles(fileSystem) {
            var files = fileSystem.files;
            if (typeof files !== 'undefined') {
                for (var i = 0; i < files.length; i++) {
                    if (typeof files[i] === 'string') {
                        result.push(files[i]);
                    } else {
                        findFiles(files[i]);
                    }
                }
            }
        }
return result;
}

2 个答案:

答案 0 :(得分:1)

您提供的代码的主要问题是您没有检查当前文件夹以查看您是否在subFolder范围内。您可以向findFiles方法添加额外的Boolean参数,以跟踪您是否在指定的子文件夹中。只有在这种情况属实时才应将文件添加到result

您的第一个循环中还存在一个错误,您每次都要在循环中更改fileSystem。您可以删除该循环,并让findFiles像处理所有其他文件一样处理根文件夹。

function listSubfolder(fileSystem, subFolder){
  var result = [];

  function findFiles(fileSystem, inSubFolder) {
    var files = fileSystem.files;
    if (typeof files !== 'undefined') {
      for (var i = 0; i < files.length; i++) {
        if (typeof files[i] === 'string') {
          if (inSubFolder) {
            result.push(files[i]);
          }
        } else {
          var currentInSubFolder = (files[i].dir === subFolder);
          findFiles(files[i], inSubFolder || currentInSubFolder);
        }
      }
    }
  }
  findFiles(fileSystem, false);
  return result;
}

答案 1 :(得分:1)

这里有几个问题。第一个是范围。

您将参数fileSystem传递给函数(L1):

function listSubfolder(fileSystem, subFolder){

但是你在功能(L5)中重新定义它:

fileSystem = fileSystem.files[i];

同样的事情也发生在你的findFiles功能(L10)上。您再次指定fileSystem(这不会使fileSystem对象从listSubFolder中断,但可能会在将来导致错误)所以我会重命名参数也是如此。

现在的第二个问题是你需要检查文件是否来自指定的子文件夹(L4):

if(typeof fileSystem.files[i] !== 'string' && fileSystem.files[i].dir === subFolder) {

最终编辑应如下所示:

function listSubfolder(fileSystem, subFolder){
    var result = [], 
        fArr;
    for(var i=0; i<fileSystem.files.length; i++){
        if(typeof fileSystem.files[i] !== 'string' && fileSystem.files[i].dir === subFolder) {
            fArr = fileSystem.files[i];
            findFiles(fArr);
        }
    }

    function findFiles(f) {
        var files = f.files;
        if (typeof files !== 'undefined') {
            for (var i = 0; i < files.length; i++) {
                if (typeof files[i] === 'string') {
                    result.push(files[i]);
                } else {
                    findFiles(files[i]);
                }
            }
        }
    }
    return result;
}