通过标记重新构造嵌套的JSON数据-Javascript
我有一个带有帖子主题的JSON文件:通过标记重新构造嵌套的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"
"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()按标记筛选主题并将它们推入一个新数组。这不是我想要的,因为它复制了任何带有多个标签的条目。