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)
}
}
}
}