如何解决Javascript/nodejs 使用嵌套数组动态构建 JS 对象
const source =
[ { title: 'Expanse',season: 1,episode: 1,path: 'download.mkv' },{ title: 'Expanse',episode: 2,{ title: 'GoT',season: 7,season: 8,episode: 4,path: 'download.mkv' }
]
我正在尝试读取此数组并创建一个将保存所有数据的对象,如下所示:因此,我可以轻松地从每个节点检索所有相关数据。
我已经尝试这样做了几天,但似乎无法让它发挥作用,请帮助 NUBE!一开始我以为我可以做
videos["Expanse"]["season"]["episode"]["path"] = "..."
它将创建所有密钥(有点像 firebase 实时数据库,但显然它并不那么容易)
const videos =
[ { title: 'Expanse',seasons:
[ { season: 'season 1',episodes:
[ { name: 'episode 1',{ name: 'episode 2',path: 'download.mkv' }
] } ] },seasons:
[ { season: 'season 7',path: 'download.mkv' }
] },{ season: 'season 8',{ name: 'episode 4',path: 'download.mkv' }
] } ] } ]
解决方法
您可以使用 reduce
并按照以下方式创建中间函数:
function buildStructure(source) {
return {
videos: source.reduce((res,episode) => {
let show = res.find(s => s.title === episode.title);
if (!show) {
show = { title: episode.title,seasons: [] };
res.push(show);
}
addEpisodeToShow(show,episode);
return res;
},[])
};
}
function addEpisodeToShow(show,episode) {
let season = show.seasons.find(s => s.season === `season ${episode.season}`);
if (!season) {
season = { season: `season ${episode.season}`,episodes: [] };
show.seasons.push(season);
}
addEpisodeToSeason(season,episode);
show.seasons.sort(compareFactory('season'));
}
function addEpisodeToSeason(season,episode) {
season.episodes.push({
name: `episode ${episode.episode}`,path: episode.path
});
season.episodes.sort(compareFactory('name'));
}
function compareFactory(key) {
return function(a,b) {
var _a = +(a[key].replace(/\D/g,'')),_b = +(b[key].replace(/\D/g,''));
return _a - _b;
}
}
const source = [
{"title": "Expanse","season": 1,"episode": 1,"path": "download.mkv" },{"title": "GoT","season": 8,"episode": 4,{"title": "Expanse","episode": 2,"season": 7,"path": "download.mkv" }
];
console.log( buildStructure(source) );
.as-console-wrapper { max-height: 100% !important; }
“简单地”这样...
const source =
[ { title: 'Expanse',season: 1,episode: 1,path: 'download.mkv'},{ title: 'Expanse',episode: 2,{ title: 'GoT',season: 7,season: 8,episode: 4,path: 'download.mkv'}
]
const result = source.reduce((a,{title,season,episode,...more} )=>
{
let titleX = a.find(x=>x.title===title)
if (!titleX)
{
titleX = { title,seasons:[] }
a.push(titleX)
}
let seasonX = titleX.seasons.find(x=>x.season===`season ${season}`)
if (!seasonX)
{
seasonX = { season:`season ${season}`,episodes:[] }
titleX.seasons.push(seasonX)
}
seasonX.episodes.push({ name:`episode ${episode}`,...more })
return a
},[])
console.log( result )
.as-console-wrapper { max-height: 100% !important; top: 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。