Javascript递归在遍历整个树之前完成
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'
]
}
]
};
我想出了一个递归的解决方案,这样当你用参数fileData
调用listFiles
时,它应该返回所需的数组:
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;
}
相关文章:
- 在Javascript中递归遍历树
- 遍历递归json树并合并
- 递归没有完全遍历具有嵌套对象的对象
- 节点.js遍历按字母顺序递归的目录
- Java 脚本:递归地遍历关联的 HTML 文件的 Dom,并打印遇到的元素类型
- 是否可以以非递归方式遍历 JavaScript 中的对象
- 节点:在递归中遍历目录
- 遍历对象的递归函数
- 遍历递归结构并将数据添加到倒数第二个节点
- 递归遍历Shadow和Light DOM
- 用phantomjs递归地遍历网站页面
- 递归遍历javascript对象并用键替换值
- 如何递归地螺旋遍历矩阵
- 遍历网格的递归函数发疯了
- 递归地遍历对象以构建属性列表
- 递归地循环遍历树,并在迭代之间设置超时
- 使用 Lodash 递归遍历数组
- 没有循环的尾递归树遍历
- Javascript递归在遍历整个树之前完成
- 如何递归地遍历一个ul并找出其中有多少个ul's