[英]Javascript recursion completes before traversing the whole tree?
我正在做一个项目,其中一个练习要求遍历下面的数据结构并返回包含所有文件(即* .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'
]
}
]
};
我想出了一个递归解决方案,这样当你调用listFiles
与参数fileData
它应该返回所需的数组:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.