3月 31, 2020 Javascript
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));
}
```
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)