当用户访问某个端点时,我尝试将种子数据显示为 JSON。我有两个表,播放列表和收藏夹。这是一种一对多的关系,其中播放列表有许多收藏夹。 JSON 的格式应如下所示:
[{
"id": 1,
"playlist_name": "Favorite songs of all time",
"favorites": [{
"id": 1,
"name": "We Will Rock You",
"artist_name": "Queen",
"genre": "Rock",
"rating": 88
}]
}]
我调用从数据库检索数据的函数是这样的:
const connection = require("../connection");
function getAll() {
return connection.select().from('playlists').join('favorites', 'playlists.id', '=', 'favorites.id')
}
module.exports = getAll;
当我调用这个函数时,我得到的结果是:
[
{
"id": 1,
"playlist_name": "chill_tunes",
"name": "Leo",
"artist_name": "John",
"genre": "Pop",
"rating": 42,
"playlist_id": 1
},
{
"id": 2,
"playlist_name": "good_vibes",
"name": "Dan",
"artist_name": "Deer",
"genre": "Rock",
"rating": 52,
"playlist_id": 1
},
{
"id": 3,
"playlist_name": "hump_day_happiness",
"name": "Nick",
"artist_name": "Legend",
"genre": "Rap",
"rating": 12,
"playlist_id": 2
}
]
我不知道如何格式化我的 JSON 数据以使其像顶部的代码一样。任何帮助将不胜感激。
最佳答案
您可以使用reduce
这里的想法是
- 在
op
对象上根据播放列表 ID 创建键。 - 如果已经有一个键,我们会将新值推送到
收藏夹
- 如果不是,我们用
{id, playlist_name , favourites:[]}
初始化favourites
并推送新值
let arr = [{"id": 1,"playlist_name": "chill_tunes","name": "Leo","artist_name": "John","genre": "Pop","rating": 42,"playlist_id": 1},{"id": 2,"playlist_name": "good_vibes","name": "Dan","artist_name": "Deer","genre": "Rock","rating": 52,"playlist_id": 1},{"id": 3,"playlist_name": "hump_day_happiness","name": "Nick","artist_name": "Legend","genre": "Rap","rating": 12,"playlist_id": 2}]
let final = arr.reduce((op,{id, playlist_name ,name ,artist_name ,genre ,rating , playlist_id}) => {
op[playlist_id] = op[playlist_id] || {id, playlist_name , favourites:[]}
op[playlist_id].favourites.push({id, playlist_id ,name ,artist_name ,genre ,rating})
return op
},{})
console.log(Object.values(final))
关于javascript - 格式化从 PostgreSql 数据库检索的 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55320526/