我正在尝试解决类似问题并遇到问题。 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;
}
答案 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;
}