对数组进行排序,从多个源创建键值对

Sorting Arrays creating key value pairs from multiple sources

提问人:john Wallace 提问时间:10/30/2019 更新时间:10/30/2019 访问量:46

问:

我有一个大型 JSON 数组,我想用它来创建键值对,将 3 个整数组合为一个对项目,将另一个整数组合为第二个对项目。

我是编码的乞丐,所以在此过程中寻找一些好的建议。代码的目的是集成到我的自动化设置中。

我试图将 showid、season 和 episode 作为一个组合整数和 episodeid 以及键值对。

所以对于下面的例子:

新数组 = [{7.2.1 : 272, 7.2.2 : 273}]

数组中的 2 个对象如下:

[
  {
    "episodes": [
      {
        "art": {
          "season.banner": "image://.jpg/",
          "season.poster": "image://.jpg/",
          "season.thumb": "image:.tbn/",
          "tvshow.banner": ".jpg/",
          "tvshow.fanart": "image:jpg/",
          "tvshow.poster": "image:jpg/"
        },
        "episode": 1,
        "episodeid": 272,
        "file": "test.avi",
        "label": "test1",
        "originaltitle": "",
        "playcount": 0,
        "plot": Hello World",
        "rating": 8,
        "season": 2,
        "thumbnail": "image.tbn/",
        "title": "test1",
        "tvshowid": 7
      },
      {
        "art": {
          "season.banner": "image://.jpg/",
          "season.poster": "image://.jpg/",
          "season.thumb": "image:.tbn/",
          "tvshow.banner": ".jpg/",
          "tvshow.fanart": "image:jpg/",
          "tvshow.poster": "image:jpg/"
        },
        "episode": 2,
        "episodeid": 273,
        "file": "test1.avi",
        "label": "test1",
        "originaltitle": "",
        "playcount": 0,
        "plot": Hello World",
        "rating": 8,
        "season": 2,
        "thumbnail": "image1.tbn/",
        "title": "test2",
        "tvshowid": 7
      },
]

我尝试使用推送进行排序,但它对我的需求来说太基础了。谁能帮忙?

JavaScript 数组排序 对象

评论


答:

-1赞 David 10/30/2019 #1

您可以使用 reducer 来获取关系数组:

const collection =
  {
    "episodes": [
      {
        "art": {
          "season.banner": "image://.jpg/",
          "season.poster": "image://.jpg/",
          "season.thumb": "image:.tbn/",
          "tvshow.banner": ".jpg/",
          "tvshow.fanart": "image:jpg/",
          "tvshow.poster": "image:jpg/"
        },
        "episode": 1,
        "episodeid": 272,
        "file": "test.avi",
        "label": "test1",
        "originaltitle": "",
        "playcount": 0,
        "plot": "Hello World",
        "rating": 8,
        "season": 2,
        "thumbnail": "image.tbn/",
        "title": "test1",
        "tvshowid": 7
      },
      {
        "art": {
          "season.banner": "image://.jpg/",
          "season.poster": "image://.jpg/",
          "season.thumb": "image:.tbn/",
          "tvshow.banner": ".jpg/",
          "tvshow.fanart": "image:jpg/",
          "tvshow.poster": "image:jpg/"
        },
        "episode": 2,
        "episodeid": 273,
        "file": "test1.avi",
        "label": "test1",
        "originaltitle": "",
        "playcount": 0,
        "plot": "Hello World",
        "rating": 8,
        "season": 2,
        "thumbnail": "image1.tbn/",
        "title": "test2",
        "tvshowid": 7
      },
]
}

relations = collection.episodes.reduce((acc, curr) => {
	const relation = {[curr.tvshowid + '.' + curr.season + '.' + curr.episode]: curr.episodeid}
	acc = [...acc,relation];
	return acc;
},[])
console.log(relations)

评论

0赞 Kobe 10/30/2019
如果始终返回具有相同返回类型的对象,请使用 map,而不是 reduce。另外,为什么要解构 acc 只是为了附加一个项目并返回它?这就是目的。push
-1赞 alexP 10/30/2019 #2

您可以使用 map 创建新数组。

var newarray = oShows.episodes.map( function(o){
    return {[o.tvshowid + "." + o.season + "." + o.episode] : o.episodeid};
});

console.log(newarray);  //[{7.2.1: 272}, {7.2.2: 273}]

我试图将 showid、season 和 episode 作为一个组合整数......

这是不可能的,因为例如“7.2.1”不是整数。您的密钥将是一个字符串。

0赞 Kobe 10/30/2019 #3

您可以简单地覆盖每个节目,然后覆盖每个剧集,然后使用模板字符串创建每个对象的键:mapmap

shows = [{
  "episodes": [
    {"episode": 1, "episodeid": 272, "season": 2, "tvshowid": 7 },
    {"episode": 2, "episodeid": 273, "season": 2, "tvshowid": 7 }
  ]
}]

const mapped = shows.map(show => show.episodes.map(o => ({
  [`${o.tvshowid}.${o.season}.${o.episode}`]: o.episodeid
})))

console.log(mapped)