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

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

我有一个像这样的 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?