Javascript 从对象属性递归生成文件路径

Javascript 从对象属性递归生成文件路径,javascript,arrays,node.js,object,recursion,Javascript,Arrays,Node.js,Object,Recursion,我正在使用node.js,作为一个辅助项目,我正在创建一个模块,该模块读取一个.json文件,解析它,然后基于对象属性&对象值,创建目录结构 对象属性(键)将是指向自身/文件的路径&对象值将是该路径的文件列表 我试图通过对象向下递归,但我不知道如何从每个对象最内部的对象提取路径 此外,对象将是用户创建的动态对象 var path='c:/templates/'; 变量模板={ //“angular应用程序”概述 src:{ 翡翠:['main.jade'], 脚本:{ 模块:{ 呈现:['in

我正在使用node.js,作为一个辅助项目,我正在创建一个模块,该模块读取一个.json文件,解析它,然后基于
对象属性
&
对象值
,创建目录结构

对象属性
(键)
将是指向自身/文件的路径&对象值将是该路径的文件列表

我试图通过对象向下递归,但我不知道如何从每个对象最内部的对象提取路径

此外,对象将是用户创建的动态对象

var path='c:/templates/';
变量模板={
//“angular应用程序”概述
src:{
翡翠:['main.jade'],
脚本:{
模块:{
呈现:['index.js'],
winodws:['index.js'],
标题:['header.js','controller.js'],
SCSS:['index.SCSS','setup.SCSS'],
}
}
},
编译:['angular.js','angular-material.js','fallback.js'],
建造:{
前端:[],//如果数组为空,则无论如何创建路径
后端:[],
资产:{
fontAwesome:['font-awesome.css'],
img:[],
svg:[]
}
}
}
//期望的结果。。。
放出=[
'c:/template name/src/jade/main.jade',
'c:/template name/src/scripts/index.js',
'c:/template name/src/scripts/modules/render/index.js',
'c:/template name/compiled/angular.js',
'c:/template name/compiled/angular material.js',
'c:/template name/compiled/fallback.js',
“c:/template name/build/frontEnd/”,
“c:/template name/build/backEnd/”,
//…等等。。。

];下面是一个如何递归编写的示例:

var路径='c:/templates';
变量模板={
//“angular应用程序”概述
src:{
翡翠:['main.jade'],
脚本:{
模块:{
呈现:['index.js'],
winodws:['index.js'],
标题:['header.js','controller.js'],
SCSS:['index.SCSS','setup.SCSS'],
}
}
},
编译:['angular.js'、'angular material.js'、'fallback.js'],
建造:{
前端:[],//如果数组为空,则无论如何创建路径
后端:[],
资产:{
fontAwesome:['font-awesome.css'],
img:[],
svg:[]
}
}
}
函数递归(项、路径、结果){
//如果未传入,则创建默认输出
结果=结果| |[];
//项是一个对象,迭代其属性
用于(让输入项){
让值=项[键];
让newPath=path+“/”+键;
如果(值的类型==“字符串”){
//如果属性是字符串,只需将其追加到结果中即可
结果推送(newPath+“/”+值);
}如果(Array.isArray(value)){
//如果一个数组
如果(value.length==0){
//只有目录名
结果.推送(newPath+“/”);
}否则{
//i删除所有文件
value.forEach(函数(arrayItem){
结果推送(newPath+“/”+arrayItem);
});
}
}否则{
//这是一个对象,递归地生成结果
递归(值、新路径、结果);
}
}
返回结果;
}
var输出=递归(模板、路径);

控制台日志(输出)我对这个问题的解决方案如下:

函数getpath(o,root=,result=[]){ var ok=Object.keys(o); 返回ok.reduce((a,k)=>{var p=root+k+“/”; 类型o[k]=“对象”&&o[k]!==null&& Array.isArray(o[k])?o[k].长度?o[k].forEach(f=>a.push(p+=f)) :a.推力(p) :getpath(o[k],p,a); 返回a; },结果); } 变量路径='c:/templates/', 模板={ //“angular应用程序”概述 src:{ 翡翠:['main.jade'], 脚本:{ 模块:{ 呈现:['index.js'], winodws:['index.js'], 标题:['header.js','controller.js'], SCSS:['index.SCSS','setup.SCSS'], } } }, 编译:['angular.js','angular-material.js','fallback.js'], 建造:{ 前端:[],//如果数组为空,则无论如何创建路径 后端:[], 资产:{ fontAwesome:['font-awesome.css'], img:[], svg:[] } } }, 路径=获取路径(模板,路径); console.log(路径)