# 第三堂:物件跟陣列資料處理之術 ## 開課提醒 1. 錄影 2. 開啟 Notion 會議軟體、ZOOM AI 摘要 3. [提醒] 觀看 [Git、GitHub 環境建置](https://courses.hexschool.com/courses/2020111311111/lectures/65186460) ## 今日上課知識點 1. 陣列 2. 物件 3. 陣列與物件整合運用 4. JSON --- ## 為什麼要學 JSON? ## 陣列 Array - ✨陣列寫法:用中括號 `[]` 包住,逗號分隔 ```jsx let colors = ["red", "black", "pink"]; console.log(colors); ``` - ✨length:抓取陣列長度 ```jsx console.log(colors.length); // 3 ``` - ✨push():在陣列末端加入一個新的值 ```jsx colors.push('blue'); console.log(colors); // ["red", "black", "pink", "blue"] ``` - ✨用索引值讀取特定的值(從 0 開始數) ```jsx const colors = ['red', 'yellow', 'black']; // 索引值: 0 1 2 console.log(colors[0]); // 'red' console.log(colors[1]); // 'yellow' ``` - ✨取得陣列最後一個值 ```jsx colors[colors.length - 1]; ``` --- **題目:** 小華去飲料店,菜單上有這些飲料: ```jsx let drinks = ["珍珠奶茶", "綠茶", "紅茶拿鐵", "冬瓜茶", "檸檬汁"]; ``` 1. 請問菜單上有幾種飲料?(用 `.length`) 2. 小華想點「紅茶拿鐵」,要怎麼取出來? 3. 小華看到最後一杯「檸檬汁」賣完了,想改點最後一杯的前一杯,怎麼取? 4. 飲料店新推出「芒果冰沙」,怎麼加到菜單最後面? --- ## 物件 Object - ✨物件寫法:用大括號 `{}` 包住 ```jsx const house = {}; ``` 👀 觀察跟陣列不同的地方: 1. 物件用 `{}`,陣列用 `[]` 2. 前面是「屬性」,後面是「值」 3. 用來描述一個東西的細節或特徵 4. 沒有順序(沒有索引值) - ✨新增物件屬性 ```jsx const obj = {}; obj.age = 18; console.log(obj); // { age: 18 } ``` - ✨物件取值 ```jsx const obj = { myName: 'yinmin', money: 3000, 123: '456' }; ``` 方法一:點記法 ```jsx console.log(obj.myName); // 'yinmin' console.log(obj.123); // ❌ 報錯!數字開頭不能用點記法 ``` 方法二:括弧記法 ```jsx console.log(obj['myName']); // 'yinmin' console.log(obj['123']); // '456' ✅ ``` > 括弧記法用在「特殊字元」或是「帶入變數」時 --- **題目:** 小美養了一隻貓,名字叫咪咪,3 歲,品種是橘貓 ```jsx const cat = { name: "咪咪", age: 3, breed: "橘貓" }; ``` 1. 用點記法取出咪咪的年齡 2. 咪咪過生日了,怎麼把 age 改成 4? 3. 小美想幫咪咪加上體重 4.5 公斤的資料,怎麼新增? --- ## 中場休息 ## 陣列與物件使用時機 - **陣列**使用時機:當資料是`大量`且`同性質`的東西 → 用 `[]` 裝起來 - **物件**使用時機:要描述一個東西的`特徵和細節` → 用 `{}` 裝起來 > 簡單記:一群同類用陣列,描述一個東西用物件 ### 題目區 **第一題:** 前鎮區有兩戶人家,第一戶家庭爸爸叫 Tom、兒子叫 Mark,第二戶家庭爸爸叫 John、兒子叫 Jack ```jsx // 選項 A let data = [ { fatherName: "Tom", sonName: "Mark" }, { fatherName: "John", sonName: "Jack" } ]; // 選項 B let data = { father1Name: "Tom", son1Name: "Mark", father2Name: "John", son2Name: "Jack" }; ``` **第二題:** 一個水果攤有 2 種水果,香蕉有 8 個,蘋果有 10 個 ```jsx // 選項 A let fruitStandData = [ { fruitName: 'banana', num: 8 }, { fruitName: 'apple', num: 10 } ]; // 選項 B let fruitStandData = { fruitType: [ { fruitName: 'banana', num: 8 }, { fruitName: 'apple', num: 10 } ] }; ``` **第三題:** Mark 有間旅館,房型有單人房與雙人房,並提供游泳服務 ```jsx // 選項 A let hotelData = { singleRoomNormalDayPrice: 1380, singleRoomHolidayPrice: 1500, singleRoomName: "單人房", doubleRoomHolidayPrice: 2380, doubleRoomHolidayPrice: 2500, doubleRoomName: "雙人房", swimming: true, boss: "Mark" }; // 選項 B let hotelData = { items: [ { normalDayPrice: 1380, holidayPrice: 1500, name: "單人房" }, { normalDayPrice: 1380, holidayPrice: 1500, name: "雙人房" } ], swimming: true, boss: "Mark" }; ``` --- ## JSON ### JSON 是什麼? JSON(JavaScript Object Notation)是一種**資料交換格式**,長得跟 JS 的物件和陣列幾乎一模一樣。 為什麼需要 JSON?因為不同系統之間要互相傳資料,需要一個**大家都看得懂的共同格式**。JSON 就是這個共同語言——輕量、好讀、幾乎所有程式語言都支援。 ### JSON 跟 JS 物件的差異 ```jsx // ✅ JS 物件:屬性名稱不用加引號 const obj = { name: "小華", age: 18 }; // ✅ JSON 格式:屬性名稱「一定要」加雙引號 { "name": "小華", "age": 18 } ``` > JSON 的規則更嚴格:屬性名一定要雙引號、不能有註解、不能有多餘的逗號 ### 好用工具 [JSON Editor Online](https://jsoneditoronline.org/) — 把拿到的 JSON 貼進去,自動幫你整理成好讀的格式 --- ## 情境拆解:看懂真實世界的 JSON 學會陣列跟物件之後,你就有能力看懂各種服務回傳的 JSON 資料了。我們來練習! ### 讀 JSON 的步驟引導 1. **看最外層**:最外面是 `[]` 還是 `{}`?→ 判斷是陣列還是物件 2. **觀察結構**:裡面包了什麼?物件裡有陣列?陣列裡有物件? 3. **找到目標資料**:我要的資訊在哪個屬性裡? 4. **取值**:用索引值 + 點記法 / 括弧記法組合取出來 --- **情境一:高雄市藥局資料** 小華打開高雄市 open data,拿到一包藥局資料的 JSON: ```jsx [ { "機構名稱": "健安藥局", "機構地址": "高雄市三民區建工路 100 號", "機構電話": "07-3456789" }, { "機構名稱": "康是美新崛江門市", "機構地址": "高雄市新興區中山一路 200 號", "機構電話": "07-2345678" } ] ``` 1. 最外層是 `[]` → 這是一個**陣列** 2. 裡面每一筆都是 `{}` → 每間藥局是一個**物件** 3. 請問:怎麼取出「康是美新崛江門市」的電話? ```jsx let data = [ /* 上面那包資料 */ ]; data[1]["機構電話"]; // "07-2345678" ``` > 因為屬性名稱是中文(特殊字元),所以要用括弧記法 --- **情境二:高雄輕軌即時資訊** 小明想查輕軌到站時間,API 回傳的 JSON 長這樣: ```jsx { "updateTime": "2026-03-17 10:30:00", "stations": [ { "stationName": "籬仔內", "nextTrain": "2 分鐘" }, { "stationName": "凱旋中華", "nextTrain": "5 分鐘" } ] } ``` 1. 最外層是 `{}` → 這是一個**物件** 2. `stations` 屬性裡面是 `[]` → 站點資料是**陣列** 3. 請問:怎麼取出「凱旋中華」的下班車時間? ```jsx data.stations[1].nextTrain; // "5 分鐘" ``` --- **情境三:Imgur 圖片服務** 小美想做一個圖片上傳功能,她看到 Imgur API 回傳的資料長這樣: ```jsx { "data": { "id": "abc123", "title": "我的貓咪", "link": "https://i.imgur.com/abc123.jpg", "width": 1920, "height": 1080 }, "success": true, "status": 200 } ``` 1. 最外層是 `{}` → 物件 2. 真正的圖片資料藏在 `data` 屬性裡,`data` 本身也是一個**物件** 3. 請問:怎麼取出圖片的連結? ```jsx response.data.link; // "https://i.imgur.com/abc123.jpg" ``` > 真實 API 常常會把資料包在 `data` 屬性裡面,外層再加上 `success`、`status` 這些狀態資訊 --- ### 搞懂 JSON 格式後,你可以看懂 - [Imgur 圖片上傳 API](https://apidocs.imgur.com/) - [即時路況停車資訊](https://traffic.transportdata.tw/) - [新聞 API](https://newsapi.org/) - [高雄 open data](https://data.kcg.gov.tw/dataset?res_format=JSON) - [台南 open data](https://data.tainan.gov.tw/DataSet) - [TDX 交通 API](https://tdx.transportdata.tw/api-service/swagger) --- ## 本週任務 必做: 1. [主線任務連結](https://rpg.hexschool.com/#/training/12063182914161572765/board/content/12063182914161572766_12063182914161572788?tid=12063182914167567603) 選作: 2. 課程筆記分享或延伸文章 - 物件淺拷貝(Shallow Copy)、深拷貝(Deep Copy) - 陣列常用方法:`unshift`、`pop`、`shift`、`splice` --- ## 正課結束,下方為加碼環節 ## AI 實驗室 上禮拜我只寫 .md,這禮拜我改成 skill 技能 | | 散裝 .md | SKILL.md | |---|---|---| | 檔案數量 | 一個任務拆 5~6 個檔案 | 一個任務一份 SKILL.md | | AI 遺忘問題 | 讀 2~3 個就忘前面的 | 一次讀完一份,不會忘 | | 執行順序 | AI 自己猜,常跳步 | 明確定義 Step 1→2→3 | | 輸出品質 | 每次格式不一樣 | 輸出格式固定,品質穩定 | | 重複提醒 | 每次對話都要說「去讀 XXX」 | 觸發詞自動載入 | | 維護成本 | 改一個邏輯要動好幾個檔案 | 改一份 SKILL.md 就好 | ![2026-03-19_10_17_20](https://hackmd.io/_uploads/Bkz4pHccZe.png) ![截圖 2026-03-20 中午12.29.44](https://hackmd.io/_uploads/HkBvTHq9Zx.png) * Skill [Muse](https://muse.cheyuwu.com/) ## 模擬面試:順序 * RobertLin792252 * Norman * Jason Good * mizuren * JackyXiang [六角人],