从Javascript中的嵌套对象创建字符串路径
我试图将表示文件系统的嵌套对象转换为表示每个文件夹和文件的文件路径的字符串数组 输入:从Javascript中的嵌套对象创建字符串路径,javascript,file,object,recursion,nested,Javascript,File,Object,Recursion,Nested,我试图将表示文件系统的嵌套对象转换为表示每个文件夹和文件的文件路径的字符串数组 输入: let obj = { 'app': { 'body': { 'abs': { 'muscles.txt': 1 }, 'foot.js': 1, 'hand.txt': 1, 'leg.txt': 1 }, 'cat.txt': 1, 'dog.js': 1, 'writing': {
let obj = {
'app': {
'body': {
'abs': {
'muscles.txt': 1
},
'foot.js': 1,
'hand.txt': 1,
'leg.txt': 1
},
'cat.txt': 1,
'dog.js': 1,
'writing': {
'pen.txt': 1,
'phone.txt': 1
}
}
};
输出:
[
'/app',
'/app/body',
'/app/body/abs/',
'/app/body/abs/muscles.txt',
'/app/body/foot.js',
'/app/body/hand.txt',
...
]
到目前为止我所拥有的(不起作用):
递归的方法是正确的。对于每个调用,循环当前对象中的每个属性,为属性创建路径并将其添加到结果数组中。如果属性键指向一个对象,那么它是一个非终端节点,并被递归调用以添加其子节点的路径
constpathify=(o,res=[],path=[])=>{
for(o中的常数方向){
const s=path.join(“/”);
res.push(`/${s?`${s}/${dir}`:dir}`);
if(o[dir]=“object”的类型){
pathify(o[dir],res,path.concat(dir));
}
}
返回res;
};
常量对象={
“应用程序”:{
“身体”:{
“abs”:{
'muscles.txt':1
},
'foot.js':1,
'hand.txt':1,
'leg.txt':1
},
“cat.txt”:1,
“dog.js”:1,
“写作”:{
“pen.txt”:1,
'phone.txt':1
}
}
};
console.log(pathify(obj))代码>以下是一个工作版本:
让obj={
“应用程序”:{
“身体”:{
“abs”:{
'muscles.txt':1
},
'foot.js':1,
'hand.txt':1,
'leg.txt':1
},
“cat.txt”:1,
“dog.js”:1,
“写作”:{
“pen.txt”:1,
'phone.txt':1
}
}
};
函数文件路径(obj,前缀='',存储=[]){
用于(输入obj){
const curPath=`${prefix}/${key}`;
如果(对象的类型[键]=“对象”){
存储。推送(curPath);
文件路径(obj[key]、curPath、store);
}否则{
存储。推送(curPath);
}
}
退货店;
}
log(文件路径(obj))
这是一个递归解决方案,它利用了扩展运算符、concat
和map
的Object.keys
方法:
让obj={
“应用程序”:{
“身体”:{
“abs”:{
'muscles.txt':1
},
'foot.js':1,
'hand.txt':1,
'leg.txt':1
},
“cat.txt”:1,
“dog.js”:1,
“写作”:{
“pen.txt”:1,
'phone.txt':1
}
}
};
函数文件路径(obj,前缀=”,存储=[]){
如果(对象类型!=“对象”)返回[前缀];
return(prefix&&[prefix]| |[]).concat(…Object.keys(obj.map)(k=>filepath(obj[k],prefix+“/”+k,store)))
}
log(filepath(obj))
您的输出的路径有时有尾随斜杠(/app/body/abs/
),有时没有(/app
,/app/body
)。你想要的结果是带斜杠还是不带斜杠,或者是否有其他标准来包含斜杠?是的,对不起,这是我的错误。我不想要拖尾斜杠。谢谢你的回答。谢谢你西尔维斯特,我知道我很接近,但我的逻辑有点偏离。
function filePaths(obj, oldKey = '', store = []) {
for (let key in obj) {
if (typeof obj[key] === 'object') {
store.push('/' + key);
filePaths(obj[key], key, store);
} else {
store.push('/' + oldKey + '/' + key);
}
}
return store;
}
filePaths(obj);