如何展开 JSON 对象并合并相似的键?
How to unflatten a JSON object and merge similar keys?
我有给定格式的 JSON :
{
"literature":
[
{
"category": "medical",
"title": "med title",
"abstract":"med abstract"
},
{
"category": "medical",
"title": "med title2",
"abstract":"med abstract2"
},
{
"category": "economics",
"title": "eco title",
"abstract":"eco abstract"
},
{
"category": "science",
"title": "sci title",
"abstract":"sci abstract"
}
]
}
期望的输出:
{
"literature":
[
{
"medical":
[
{
"title": "med title",
"abstract":"med abstract"
},
{
"title": "med title2",
"abstract":"med abstract2"
}
]
},
{
"economics":
[
{
"title": "eco title",
"abstract":"eco abstract"
}
]
},
{
"science":
[
{
"title": "sci title",
"abstract":"sci abstract"
}
]
}
]
}
我会使用 JSON.parse()
将 JSON 转换为 javascript 对象,然后修改该对象,将类别属性作为键并将数据合并到相似键中如上图所示。这三天以来我很震惊,请帮帮我。
创建新对象并使用 for...of 重写值
const response = {
"literature":
[
{
"category": "medical",
"title": "med title",
"abstract":"med abstract"
},
{
"category": "medical",
"title": "med title2",
"abstract":"med abstract2"
},
{
"category": "economics",
"title": "eco title",
"abstract":"eco abstract"
},
{
"category": "science",
"title": "sci title",
"abstract":"sci abstract"
}
]
}
function groupByCategory(items) {
const grouped = {}
for(const item of items) {
grouped[item.category] = grouped[item.category] || [];
const itemCopy = { ...item };
delete itemCopy.category
grouped[item.category].push(itemCopy)
}
console.log(grouped)
}
groupByCategory(response.literature)
您可以使用 reduce
轻松完成,如下所示
const rawData = {"literature":[{"category":"medical","title":"medtitle","abstract":"medabstract"},{"category":"medical","title":"medtitle2","abstract":"medabstract2"},{"category":"economics","title":"ecotitle","abstract":"ecoabstract"},{"category":"science","title":"scititle","abstract":"sciabstract"}]}
function formatData(data) {
return Object.keys(data).reduce((acc, key) => {
acc[key] = data[key].reduce((groups, {category, ...rest}) => {
if (!groups[category]) {
groups[category] = [];
}
groups[category].push(rest);
return groups;
}, {});
return acc;
}, {});
}
const result = formatData(rawData);
console.log(result)
我有给定格式的 JSON :
{
"literature":
[
{
"category": "medical",
"title": "med title",
"abstract":"med abstract"
},
{
"category": "medical",
"title": "med title2",
"abstract":"med abstract2"
},
{
"category": "economics",
"title": "eco title",
"abstract":"eco abstract"
},
{
"category": "science",
"title": "sci title",
"abstract":"sci abstract"
}
]
}
期望的输出:
{
"literature":
[
{
"medical":
[
{
"title": "med title",
"abstract":"med abstract"
},
{
"title": "med title2",
"abstract":"med abstract2"
}
]
},
{
"economics":
[
{
"title": "eco title",
"abstract":"eco abstract"
}
]
},
{
"science":
[
{
"title": "sci title",
"abstract":"sci abstract"
}
]
}
]
}
我会使用 JSON.parse()
将 JSON 转换为 javascript 对象,然后修改该对象,将类别属性作为键并将数据合并到相似键中如上图所示。这三天以来我很震惊,请帮帮我。
创建新对象并使用 for...of 重写值
const response = {
"literature":
[
{
"category": "medical",
"title": "med title",
"abstract":"med abstract"
},
{
"category": "medical",
"title": "med title2",
"abstract":"med abstract2"
},
{
"category": "economics",
"title": "eco title",
"abstract":"eco abstract"
},
{
"category": "science",
"title": "sci title",
"abstract":"sci abstract"
}
]
}
function groupByCategory(items) {
const grouped = {}
for(const item of items) {
grouped[item.category] = grouped[item.category] || [];
const itemCopy = { ...item };
delete itemCopy.category
grouped[item.category].push(itemCopy)
}
console.log(grouped)
}
groupByCategory(response.literature)
您可以使用 reduce
轻松完成,如下所示
const rawData = {"literature":[{"category":"medical","title":"medtitle","abstract":"medabstract"},{"category":"medical","title":"medtitle2","abstract":"medabstract2"},{"category":"economics","title":"ecotitle","abstract":"ecoabstract"},{"category":"science","title":"scititle","abstract":"sciabstract"}]}
function formatData(data) {
return Object.keys(data).reduce((acc, key) => {
acc[key] = data[key].reduce((groups, {category, ...rest}) => {
if (!groups[category]) {
groups[category] = [];
}
groups[category].push(rest);
return groups;
}, {});
return acc;
}, {});
}
const result = formatData(rawData);
console.log(result)