Javascript/nodejs使用嵌套数组动态构建JS对象

Javascript/nodejs使用嵌套数组动态构建JS对象,javascript,node.js,json,dynamic,nested,Javascript,Node.js,Json,Dynamic,Nested,我有一个Js对象数组,如下所示: const源= [{标题:'Expanse',第1季,第1集,路径:'download.mkv'} ,{标题:'Expanse',第1季,第2集,路径:'download.mkv'} ,{标题:'GoT',第七季,第1集,路径:'download.mkv'} ,{标题:'GoT',第8季,第1集,路径:'download.mkv'} ,{标题:'GoT',第8季,第4集,路径:'download.mkv'} ] 我试图读取此数组并创建一个对象,该对象将保存所

我有一个Js对象数组,如下所示:

const源=
[{标题:'Expanse',第1季,第1集,路径:'download.mkv'}
,{标题:'Expanse',第1季,第2集,路径:'download.mkv'}
,{标题:'GoT',第七季,第1集,路径:'download.mkv'}
,{标题:'GoT',第8季,第1集,路径:'download.mkv'}
,{标题:'GoT',第8季,第4集,路径:'download.mkv'}
] 
我试图读取此数组并创建一个对象,该对象将保存所有数据,如下所示:因此,我可以从每个节点轻松检索所有相关数据。
我已经试着做了几天,但似乎无法让它工作,请帮助一个裸体!一开始我以为我能做到

videos["Expanse"]["season"]["episode"]["path"] = "..."  
它将创建所有密钥(有点像firebase实时数据库,但显然不是那么容易)

const视频=
[{标题:“广阔”,季节:
[{第1季:'第1季',剧集:
[{name:'eposion 1',path:'download.mkv'}
,{name:'第二集',路径:'download.mkv'}
] } ] } 
,{标题:'GoT',季节:
[{第七季,剧集:
[{name:'eposion 1',path:'download.mkv'}
] } 
,{第八季,剧集:
[{name:'eposion 1',path:'download.mkv'}
,{name:'第四集',路径:'download.mkv'}
] } ] } ] 
您可以使用和创建以下中介函数:

函数构建结构(源代码){
返回{
视频:source.reduce((分辨率,集)=>{
let show=res.find(s=>s.title==eposion.title);
如果(!show){
show={title:eposion.title,seasures:[]};
res.push(表演);
}
addEpisodeToShow(节目、插曲);
返回res;
}, [])
};
}
功能添加PISODETOSHOW(节目、插曲){
让seasure=show.seasures.find(s=>s.seasure===`seasure${seeption.seasure}`);
如果(!季节){
季节={季节:`季节${集.季节}',集:[]};
秀。季。推(季);
}
增编本季(季、集);
show.seasures.sort(compareFactory('seasure'));
}
功能附加节目(季、集){
季、集、推({
名称:`Spidence${Spidence.Spidence}`,
路径:eposion.path
});
季节。情节。排序(compareFactory('name');
}
函数比较(键){
返回函数(a,b){
变量a=+(a[键]。替换(/\D/g',),
_b=+(b[键]。替换(/\D/g',);
返回_a-_b;
}
}
常量源=[
{“title”:“Expanse”,“季刊”:1,“插曲”:1,“路径”:“download.mkv”},
{“title”:“GoT”,“season”:8,“eposion”:4,“path”:“download.mkv”},
{“title”:“Expanse”,“季刊”:1,“插曲”:2,“path”:“download.mkv”},
{“title”:“GoT”,“season”:7,“eposion”:1,“path”:“download.mkv”},
{“title”:“GoT”,“season”:8,“eposion”:1,“path”:“download.mkv”}
];
log(buildStructure(source))
。作为控制台包装{max height:100%!important;}
您可以使用并创建以下中介函数:

函数构建结构(源代码){
返回{
视频:source.reduce((分辨率,集)=>{
let show=res.find(s=>s.title==eposion.title);
如果(!show){
show={title:eposion.title,seasures:[]};
res.push(表演);
}
addEpisodeToShow(节目、插曲);
返回res;
}, [])
};
}
功能添加PISODETOSHOW(节目、插曲){
让seasure=show.seasures.find(s=>s.seasure===`seasure${seeption.seasure}`);
如果(!季节){
季节={季节:`季节${集.季节}',集:[]};
秀。季。推(季);
}
增编本季(季、集);
show.seasures.sort(compareFactory('seasure'));
}
功能附加节目(季、集){
季、集、推({
名称:`Spidence${Spidence.Spidence}`,
路径:eposion.path
});
季节。情节。排序(compareFactory('name');
}
函数比较(键){
返回函数(a,b){
变量a=+(a[键]。替换(/\D/g',),
_b=+(b[键]。替换(/\D/g',);
返回_a-_b;
}
}
常量源=[
{“title”:“Expanse”,“季刊”:1,“插曲”:1,“路径”:“download.mkv”},
{“title”:“GoT”,“season”:8,“eposion”:4,“path”:“download.mkv”},
{“title”:“Expanse”,“季刊”:1,“插曲”:2,“path”:“download.mkv”},
{“title”:“GoT”,“season”:7,“eposion”:1,“path”:“download.mkv”},
{“title”:“GoT”,“season”:8,“eposion”:1,“path”:“download.mkv”}
];
log(buildStructure(source))
。作为控制台包装{max height:100%!important;}
“简单地”用这种方式

const源=
[{标题:'Expanse',第1季,第1集,路径:'download.mkv'}
,{标题:'Expanse',第1季,第2集,路径:'download.mkv'}
,{标题:'GoT',第七季,第1集,路径:'download.mkv'}
,{标题:'GoT',第8季,第1集,路径:'download.mkv'}
,{标题:'GoT',第8季,第4集,路径:'download.mkv'}
]
const result=source.reduce((a,{标题、季节、插曲,…更多})=>
{
让titleX=a.find(x=>x.title==title)
如果(!titleX)
{
titleX={标题,季节:[]}
a、 推(标题)
}
让seasurex=titleX.seasures.find(x=>x.seasure===`seasure${seasure}`)
如果(!季节X)
{
季节X={季节:`season${season}`,剧集:[]}
标题.季节.推送(季节X)
}
sessions.push({name:`session${session}`,…more})
归还
},[])
console.log(结果)
.as控制台包装{max height:100%!important;top:0;}
“简单地”用这种方式

const源=
[{标题:'Expanse',第1季,第1集,路径:'download.mkv'}
,{标题:'Expanse',第1季,第2集,路径:'download.mkv'}
,{标题:'GoT',第七季,第1集,路径:'download.mkv'}
,{标题:'GoT',第8季,第1集,路径:'download.mkv'}
,{标题:'GoT',第8季,第4集