我想以递归方式提取此结构中的文件。我已经完成了第一级,但无法继续进行。
var DirectoryTree = {
dir: 'project1',
files: [
'proj.config', {
dir: 'src',
files: [
'name.htm',
'dept.htm',
'salary.htm', {
dir: 'scripts',
files: [
'name.js',
'dept.js',
'salary.js'
]
}
]
}, {
dir: 'project2',
files: [
'proj.config', {
dir: 'src',
files: [
'name.htm',
'dept.htm',
'salary.htm', {
dir: 'scripts',
files: [
'name.js',
'dept.js',
'salary.js'
]
}
]
}
]
}
]
};
以下是我现在的代码。我有点被困在这里。你能帮我从下一级获取数据。
function listFiles(dirTree, subFolder){
var fList=[];
if(dirTree.files){
for (var i=0;i<dirTree.files.length;i++){
if(typeof dirTree.files[i] === 'string'){
fList.push(dirTree.files[i]);
}
}
}
if(dirTree.dir){
return(listFiles(dirTree.dir, subFolder));
}
return fList;
}
答案 0 :(得分:1)
您可以递归执行此操作,例如
function getFiles(currentObject, result) {
var type = Object.prototype.toString.call(currentObject),
idx;
if (type === "[object Object]") {
for (idx in currentObject) {
if (currentObject.hasOwnProperty(idx) && idx === "files") {
currentObject[idx].forEach(function(object) {
getFiles(object, result);
});
}
}
} else if (type === "[object Array]") {
currentObject.forEach(function(object) {
getFiles(object, result);
});
} else if (type === "[object String]") {
result.push(currentObject);
}
return result;
}
console.log(getFiles(DirectoryTree, []))
<强>输出强>
[ 'proj.config',
'name.htm',
'dept.htm',
'salary.htm',
'name.js',
'dept.js',
'salary.js',
'proj.config',
'name.htm',
'dept.htm',
'salary.htm',
'name.js',
'dept.js',
'salary.js' ]
答案 1 :(得分:0)
我今天回答了类似的问题,并使用一些下划线功能解决了这个问题 您的示例的格式非常奇怪,但我建议再次使用递归函数进行此类读取:
function recursiveFuntion(collection){
collection.forEach(function(model) {
//console.log(model.files); --> Or do whatever you need
if(model.files.length > 0){
recursiveFunction(model);
};
});
};
recursiveFuntion(DirectoryTree.files);
递归函数的好处是它是动态的 由于您不使用数组但使用对象,因此您需要自定义此代码 但这是基本原则。