JSON 的 Structure 可以像一個樹一樣去表達資料,但是傳統的 Relational Database 只可以使用一張張的 Table 來儲存資料,如果要把數張 Table 的內容合併為一個 JSON 來使用的話,可以通過使用 mapping 的方法把關聯的 ID 值串合起來。 ### 例子 考慮到有以下的資料: Table: users |id|name|age| |---| |1|peter|11| |2|tom|12| |3|mary|13| Table: user_fruits |id|user_id|fruit| |---| |1|1|apple| |2|1|orange| |3|2|apple| |3|2|banana| |3|3|orange| |3|3|banana| |3|3|apple| 考慮到要抽出以下的 JSON 格式 : ```json [ {"name":"peter", "age": 11, fruits:["apple","orange"]}, {"name":"tom", "age": 12, fruits:["apple","banana"]}, {"name":"mary", "age": 13, fruits:["orange","banana","apple"]} ] ``` 應該要如何轉換呢? ### 解決方法 使用 Loop 是必需要的,因為而一個個 Data Object 互相 Mapping。不過在語法上可以使用 JS 一句內完成的。 ```js users.forEach(user => user.fruits = userFruits.filter(userFruit => user.id === userFruit.user_id).map(userFruit => userFruit.fruit)); ``` 以下是一個完整的示範 : ```js // get users var users = await db.query(`select * from users`); // fetch user id as array var userIds = users.map(user => user.id); // check users is empty if( users.length > 0 ) { // fetch user fruits by user id var userFruits = await db.query(`select * from user_fruits where user_id in (?)`, [userIds]); // map user fruit data to users users.forEach(user => user.fruits = userFruits.filter(userFruit => user.id === userFruit.user_id).map(userFruit => userFruit.fruit)); } ```