Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js递归-不起作用_Javascript_Recursion - Fatal编程技术网

Javascript js递归-不起作用

Javascript js递归-不起作用,javascript,recursion,Javascript,Recursion,我的文件夹和文件结构如下: var dir1 = { files:[], sub_dirs:{ "yoyo" : { files:["koko"] } } } 我需要找到特定文件名的所有路径,我在递归中这样做(在jsfiidle中查找),只有当我有一个子目录时,我才能成功地这样做,如上例所示,但如果我有多个子目录,它就不起作用了: var dir2 = { files : ["bobo"], sub

我的文件夹和文件结构如下:

var dir1 = {
    files:[],
    sub_dirs:{
        "yoyo" : {
            files:["koko"]
        }
   }
}
我需要找到特定文件名的所有路径,我在递归中这样做(在jsfiidle中查找),只有当我有一个子目录时,我才能成功地这样做,如上例所示,但如果我有多个子目录,它就不起作用了:

var dir2 = {
    files : ["bobo"], 
    sub_dirs : {
        "yoyo":{
            files:["koko"],
            sub_dirs:{
                "toto1":{
                    files:["bono"],
                    sub_dirs:{
                        "tomo1":{
                            files:["koko"]
                        }
                    }
                }
            }
        },
        "soso":{
            files:["koko"],
            sub_dirs:{
                "toto2":{
                    files:["bono"],
                    sub_dirs:{
                        "tomo2":{
                            files:["koko"]
                        }
                    }
                }
            }
        }
    }
 }  
它只打印第一个目录中的路径。 看见
如何修复它?

我在您的代码中发现两个问题

我想你知道,但我想提醒你,如果你没有为任何变量指定type meansVAR,它将成为全局变量或对象

因此,这里:

内部助手--

这些文件和子文件将变为全局文件,您将在每次递归中更新它们。 我想这对你来说是有道理的

第二期

使用for(对象中的var键)而不是while循环,因为您希望迭代对象而不是数组

因此,如果您使用:

for(var directory in dir.sub_dirs){
  var tempPath  = path + "/" + directory;
  helper(filename , dir.sub_dirs[directory] , arrValidpathes , tempPath);
}

它将代替while循环工作。

以下操作应该可以工作。我修改了sub_dirs,使其成为对象数组

var filename = "koko";

// ./koko
var dir = {
    files: ["koko"]
};


// ./yoyo/koko
var dir1 = {
    files: [],
    sub_dirs: [{
        "yoyo": {
            files: ["koko"]
        }
    }]
};


//./yoyo/koko/
// ./yoyo/toto/tomo/koko
// ./soso/koko
// ./soso/toto2/tomo2/koko
var dir2 = {
    files: ["bobo"],
    sub_dirs: [{
        "yoyo": {
            files: ["koko"],
            sub_dirs: [{
                "toto1": {
                    files: ["bono"],
                    sub_dirs: [{
                        "tomo1": {
                            files: ["koko"]
                        }
                    }]
                }
            }]
        },
        "soso": {
            files: ["koko"],
            sub_dirs: [{
                "toto2": {
                    files: ["bono"],
                    sub_dirs: [{
                        "tomo2": {
                            files: ["koko"]
                        }
                    }]
                }
            }]
        }
    }]
};

var arrValidpathes = [];
lookup(dir, filename);
lookup(dir1, filename);
lookup(dir2, filename);


function lookup(dir, filename) {
    helper(filename, dir, [], "./");
}


function helper(filename, myDir, arrValidpathes, path) {
    if (myDir == null || myDir == undefined) return;
    var files = myDir.files;
    var allsubdirs = myDir.sub_dirs;

    if (files != null && files != undefined && files.indexOf(filename) != -1) {
        console.log(path + "/" + filename);
    }

    if (allsubdirs == null || allsubdirs == undefined) {
        return;
    } else {
        for (var i = 0; i < allsubdirs.length; i++) {
            var subdirs = allsubdirs[i];

            for (var item in subdirs) {
                path = path + "/" + item;
                helper(filename, subdirs[item], arrValidpathes, path)
            }
        }
    }

}
var filename=“koko”;
///科科
var dir={
文件:[“koko”]
};
///溜溜球/高子
var dir1={
文件:[],
子目录:[{
“yoyo”:{
文件:[“koko”]
}
}]
};
///溜溜球/高子/
///yoyo/toto/tomo/koko
///索索/科科
///soso/TOTOO2/tomo2/koko
var dir2={
文件:[“bobo”],
子目录:[{
“yoyo”:{
文件:[“koko”],
子目录:[{
“toto1”:{
文件:[“bono”],
子目录:[{
“第1条”:{
文件:[“koko”]
}
}]
}
}]
},
“soso”:{
文件:[“koko”],
子目录:[{
“toto2”:{
文件:[“bono”],
子目录:[{
“tomo2”:{
文件:[“koko”]
}
}]
}
}]
}
}]
};
var arrValidpathes=[];
查找(目录,文件名);
查找(dir1,文件名);
查找(dir2,文件名);
函数查找(目录,文件名){
助手(文件名,目录,[],“/”);
}
函数助手(文件名、myDir、arrvalidPath、路径){
if(myDir==null | | myDir==undefined)返回;
var files=myDir.files;
var allsubdirs=myDir.sub_dirs;
if(files!=null&&files!=undefined&&files.indexOf(filename)!=1){
log(路径+“/”+文件名);
}
if(allsubdirs==null | | allsubdirs==未定义){
返回;
}否则{
对于(变量i=0;i
看起来您的JSON无效。核实一下
var filename = "koko";

// ./koko
var dir = {
    files: ["koko"]
};


// ./yoyo/koko
var dir1 = {
    files: [],
    sub_dirs: [{
        "yoyo": {
            files: ["koko"]
        }
    }]
};


//./yoyo/koko/
// ./yoyo/toto/tomo/koko
// ./soso/koko
// ./soso/toto2/tomo2/koko
var dir2 = {
    files: ["bobo"],
    sub_dirs: [{
        "yoyo": {
            files: ["koko"],
            sub_dirs: [{
                "toto1": {
                    files: ["bono"],
                    sub_dirs: [{
                        "tomo1": {
                            files: ["koko"]
                        }
                    }]
                }
            }]
        },
        "soso": {
            files: ["koko"],
            sub_dirs: [{
                "toto2": {
                    files: ["bono"],
                    sub_dirs: [{
                        "tomo2": {
                            files: ["koko"]
                        }
                    }]
                }
            }]
        }
    }]
};

var arrValidpathes = [];
lookup(dir, filename);
lookup(dir1, filename);
lookup(dir2, filename);


function lookup(dir, filename) {
    helper(filename, dir, [], "./");
}


function helper(filename, myDir, arrValidpathes, path) {
    if (myDir == null || myDir == undefined) return;
    var files = myDir.files;
    var allsubdirs = myDir.sub_dirs;

    if (files != null && files != undefined && files.indexOf(filename) != -1) {
        console.log(path + "/" + filename);
    }

    if (allsubdirs == null || allsubdirs == undefined) {
        return;
    } else {
        for (var i = 0; i < allsubdirs.length; i++) {
            var subdirs = allsubdirs[i];

            for (var item in subdirs) {
                path = path + "/" + item;
                helper(filename, subdirs[item], arrValidpathes, path)
            }
        }
    }

}