我需要遍历一个对象并从中递归地 return 一些值
I need to traverse an object and return some values from it recursively
我将可选的第二个参数传递给 'listFiles' 时卡住了。我正在努力寻找如何列出给定子目录中的文件。列出数据描述的文件系统的给定目录中的文件。因此,您应该能够 return 来自数据的文件列表。
参数:
data {Object}
- 如上所述的文件系统对象
dirName {String}
- 需要从中列出文件的目录名称。
注:该参数可选。如果未提供,请列出所有文件。
Returns {Array}
目录dirName下的文件,包括子目录。
完成这个练习的方法应该是使用递归。我能够使用以下代码 return 文件系统对象中的所有文件:
const fileData = {
dirName: 'app',
files: ['index.html'],
subDirs: [{
dirName: 'js',
files: [
'main.js',
'app.js',
'misc.js',
],
subDirs: [{
dirName: 'vendor',
files: [
'jquery.js',
'underscore.js',
],
subDirs: [],
}, ],
},
{
dirName: 'css',
files: [
'reset.css',
'main.css',
],
subDirs: [],
},
],
};
function listFiles(data, dirName) {
let result = [];
const traverseFileSystem = (obj) => {
Object.keys(obj).forEach((key) => {
if (obj[key] && typeof obj[key] === 'object') {
if (key === 'files') {
result = [...result, ...obj[key]];
}
traverseFileSystem(obj[key]);
}
});
};
traverseFileSystem(data);
console.log(result);
}
listFiles(fileData, 'js');
尝试
const trFS= dir=> dir.dirName==dirName ? dir : dir.subDirs.flatMap(d=> trFS(d));
const trFSNoDir = dir => [...dir.subDirs.flatMap(d=> trFSNoDir(d)), ...dir.files];
const fileData = {
dirName: 'app',
files: ['index.html'],
subDirs: [{
dirName: 'js',
files: [
'main.js',
'app.js',
'misc.js',
],
subDirs: [{
dirName: 'vendor',
files: [
'jquery.js',
'underscore.js',
],
subDirs: [],
}, ],
},
{
dirName: 'css',
files: [
'reset.css',
'main.css',
],
subDirs: [],
},
],
};
function listFiles(data, dirName) {
const trFS= dir=> dir.dirName==dirName ? dir : dir.subDirs.flatMap(d=> trFS(d));
const trFSNoDir = dir => [...dir.subDirs.flatMap(d=> trFSNoDir(d)), ...dir.files];
return dirName ? trFS(data)[0] : trFSNoDir(data);
}
console.log("dir name: js\n", listFiles(fileData, 'js'));
console.log("dir name: css\n", listFiles(fileData, 'css'));
console.log("dir name: -\n",listFiles(fileData));
当给出 dirName 时,我 return 包含文件和子目录的对象(而不是数组),因为您没有指定输出数组的外观(例如,该数组中的子目录是否应该只是对象或名称)-这个对象可以用简单的方式映射到数组(例如,如果 r
包含结果,那么 [...r.files,...r.subDirs]
)。
完整的解决方案:
function listFiles(data,dirName,level){
var files=[];
if(!level){
level=0;
data=[data];
}
for(var item of data){
var subDirs=item.subDirs;
if(subDirs && subDirs.length){
files=files.concat(listFiles(subDirs,dirName,level+1));
}
if(dirName && item.dirName !== dirName){
continue;
}
files.push(item);
}
return files;
}
我将可选的第二个参数传递给 'listFiles' 时卡住了。我正在努力寻找如何列出给定子目录中的文件。列出数据描述的文件系统的给定目录中的文件。因此,您应该能够 return 来自数据的文件列表。
参数:
data {Object}
- 如上所述的文件系统对象
dirName {String}
- 需要从中列出文件的目录名称。
注:该参数可选。如果未提供,请列出所有文件。
Returns {Array}
目录dirName下的文件,包括子目录。
完成这个练习的方法应该是使用递归。我能够使用以下代码 return 文件系统对象中的所有文件:
const fileData = {
dirName: 'app',
files: ['index.html'],
subDirs: [{
dirName: 'js',
files: [
'main.js',
'app.js',
'misc.js',
],
subDirs: [{
dirName: 'vendor',
files: [
'jquery.js',
'underscore.js',
],
subDirs: [],
}, ],
},
{
dirName: 'css',
files: [
'reset.css',
'main.css',
],
subDirs: [],
},
],
};
function listFiles(data, dirName) {
let result = [];
const traverseFileSystem = (obj) => {
Object.keys(obj).forEach((key) => {
if (obj[key] && typeof obj[key] === 'object') {
if (key === 'files') {
result = [...result, ...obj[key]];
}
traverseFileSystem(obj[key]);
}
});
};
traverseFileSystem(data);
console.log(result);
}
listFiles(fileData, 'js');
尝试
const trFS= dir=> dir.dirName==dirName ? dir : dir.subDirs.flatMap(d=> trFS(d));
const trFSNoDir = dir => [...dir.subDirs.flatMap(d=> trFSNoDir(d)), ...dir.files];
const fileData = {
dirName: 'app',
files: ['index.html'],
subDirs: [{
dirName: 'js',
files: [
'main.js',
'app.js',
'misc.js',
],
subDirs: [{
dirName: 'vendor',
files: [
'jquery.js',
'underscore.js',
],
subDirs: [],
}, ],
},
{
dirName: 'css',
files: [
'reset.css',
'main.css',
],
subDirs: [],
},
],
};
function listFiles(data, dirName) {
const trFS= dir=> dir.dirName==dirName ? dir : dir.subDirs.flatMap(d=> trFS(d));
const trFSNoDir = dir => [...dir.subDirs.flatMap(d=> trFSNoDir(d)), ...dir.files];
return dirName ? trFS(data)[0] : trFSNoDir(data);
}
console.log("dir name: js\n", listFiles(fileData, 'js'));
console.log("dir name: css\n", listFiles(fileData, 'css'));
console.log("dir name: -\n",listFiles(fileData));
当给出 dirName 时,我 return 包含文件和子目录的对象(而不是数组),因为您没有指定输出数组的外观(例如,该数组中的子目录是否应该只是对象或名称)-这个对象可以用简单的方式映射到数组(例如,如果 r
包含结果,那么 [...r.files,...r.subDirs]
)。
完整的解决方案:
function listFiles(data,dirName,level){
var files=[];
if(!level){
level=0;
data=[data];
}
for(var item of data){
var subDirs=item.subDirs;
if(subDirs && subDirs.length){
files=files.concat(listFiles(subDirs,dirName,level+1));
}
if(dirName && item.dirName !== dirName){
continue;
}
files.push(item);
}
return files;
}