Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过标记重新构造嵌套的JSON数据-Javascript_Javascript_Arrays_Json - Fatal编程技术网

通过标记重新构造嵌套的JSON数据-Javascript

通过标记重新构造嵌套的JSON数据-Javascript,javascript,arrays,json,Javascript,Arrays,Json,我有一个带有帖子主题的JSON文件: "topics": [ { "id": "9551", "tags": ["tag1", "tag2"], "title": "title" }, { "id": "9552", "tags": ["tag3"], "title": "title2" }, { "id": "9553", "tags": ["tag1"], "title": "title3"

我有一个带有帖子主题的JSON文件:

"topics": [
  {
    "id": "9551",
    "tags": ["tag1", "tag2"],
    "title": "title"
   },
   {
    "id": "9552",
    "tags": ["tag3"],
    "title": "title2"
   },
   {
    "id": "9553",
    "tags": ["tag1"],
    "title": "title3"
   }
]
我想按标签对这些帖子进行排序,如下所示:

 "tags" : {
     "tag1": [
         { "id": "9951",
           "title": "title"
          },
          {
          "id": "9553",
          "title": "title3"
          }
     ],
     "tag2": [
        {
        "id": "9551",
        "title": "title"
       }
      ]
    }
我不确定上面的内容是否有效,但本质上我想要原始数据的有效JSON输出,只按标记排序

谢谢你的建议

您可以使用将标签分组。创建一个累加器,每个标记作为
。在reduce内部,循环遍历每个
标记。如果已经添加了
标记
,则将
{id,title}
对象推送到数组中。否则,为该标记创建一个新数组,然后推送它

const topics=[{“id”:“9551”,“tags”:[“tag1”,“tag2”],“title”:“title”},{“id”:“9552”,“tags”:[“tag3”],“title”:“title2”},{“id”:“9553”,“tags”:[“tag1”],“title”:“title3”}]
const group=topics.reduce((acc,{id,tags,title})=>{
tags.forEach(t=>{
acc[t]=acc[t]| |[];
acc[t].推送({id,title})
})
返回acc;
}, {})
log({tags:group})
您可以使用它对标记进行分组。创建一个累加器,每个标记作为
。在reduce内部,循环遍历每个
标记。如果已经添加了
标记
,则将
{id,title}
对象推送到数组中。否则,为该标记创建一个新数组,然后推送它

const topics=[{“id”:“9551”,“tags”:[“tag1”,“tag2”],“title”:“title”},{“id”:“9552”,“tags”:[“tag3”],“title”:“title2”},{“id”:“9553”,“tags”:[“tag1”],“title”:“title3”}]
const group=topics.reduce((acc,{id,tags,title})=>{
tags.forEach(t=>{
acc[t]=acc[t]| |[];
acc[t].推送({id,title})
})
返回acc;
}, {})

console.log({tags:group})
另一个版本,它没有将输出结构修复为只
{id,title}
,保留存在的内容并仅从每个对象中删除
标记可能如下所示:

 "tags" : {
     "tag1": [
         { "id": "9951",
           "title": "title"
          },
          {
          "id": "9553",
          "title": "title3"
          }
     ],
     "tag2": [
        {
        "id": "9551",
        "title": "title"
       }
      ]
    }
constbytag=(topics)=>topics.reduce(
(a,{tags=[],…rest}=>tags.reduce(
(a,tag)=>({…a[tag]:[…(a[tag]| |[]),rest]}),
A.
), {}
)
const topics=[{id:“9551”,标记:[“tag1”,“tag2”],标题:“title”},{id:“9552”,标记:[“tag3”],标题:“title2”},{id:“9553”,标记:[“tag1”],标题:“title3”};
日志(按标签(主题))
console.log(按标签(主题))

const log=(obj)=>console.log(JSON.parse(JSON.stringify(obj))
另一个版本,它没有将输出结构固定为仅
{id,title}
,保留现有内容并仅从每个对象中删除
标记,可能如下所示:

 "tags" : {
     "tag1": [
         { "id": "9951",
           "title": "title"
          },
          {
          "id": "9553",
          "title": "title3"
          }
     ],
     "tag2": [
        {
        "id": "9551",
        "title": "title"
       }
      ]
    }
constbytag=(topics)=>topics.reduce(
(a,{tags=[],…rest}=>tags.reduce(
(a,tag)=>({…a[tag]:[…(a[tag]| |[]),rest]}),
A.
), {}
)
const topics=[{id:“9551”,标记:[“tag1”,“tag2”],标题:“title”},{id:“9552”,标记:[“tag3”],标题:“title2”},{id:“9553”,标记:[“tag1”],标题:“title3”};
日志(按标签(主题))
console.log(按标签(主题))

const log=(obj)=>console.log(JSON.parse(JSON.stringify(obj))
“我想要…”-我们希望您展示一些(研究)成果。到目前为止你都试了些什么?出现了什么问题?一种非常基本的方法:我将所有标记推入一个新数组,并尝试在for..each循环中使用find()按标记筛选主题并将它们推入一个新数组。这不是我想要的,因为它复制了任何带有多个标签的条目。“我想要…”-我们希望你展示一些(研究)成果。到目前为止你都试了些什么?出现了什么问题?一种非常基本的方法:我将所有标记推入一个新数组,并尝试在for..each循环中使用find()按标记筛选主题并将它们推入一个新数组。这不是我想要的,因为它复制了任何带有多个标签的条目。