--- tags: JS 直播班 - 2022 秋季班 --- ###### tags: `簡單` # 物件與陣列設計 ## 本章節我們要學什麼? 前面幾週練習了字串與數字,這次要來學習「物件與陣列」。在 Javascript 中,**陣列是一種具有特殊方法與屬性的物件**,可以把陣列視作「特別用於存儲有序列狀的資料」的資料型態。 * 物件:一個物體,由鍵與值構成與描述。 * 陣列:一個清單,由元素和索引構成。 參考文件:[MDN陣列](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array)、[MDN物件](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/) ![](https://i.imgur.com/XCkhtuf.jpg) ![](https://i.imgur.com/OhCiUsE.jpg) ## 題目一:創建陣列與物件 請分別創建一個陣列與物件用於存儲以下資訊並在瀏覽器的 Console 中打印出來: * **待買備忘錄 (用陣列表示)** * 牛奶 * 酪梨 * 咖啡粉 * 咖啡粉 * 蘋果麵包 * **用戶的資訊 (用物件表示)** * 年紀: 20 * 名稱: 小明 * 生理性別: 男 * 興趣: 前端開發、讀書、跑步 * 喜歡的食物: 滷肉飯 * 吃素: 否 ``` =JavaScrip // 附註:同學可嘗試放入任何自訂內容,著重在練習語法操作。 // Todo 待修改 const toBuyList = [] const userInfo = {} console.log(toBuyList) console.log(userInfo) // Output 輸出 ["牛奶", "酪梨", "咖啡粉", "蘋果麵包"] { age: 20, name: "小明", sex: "男", hobby: ["前端開發", "讀書", "跑步"], favoriteFood: "滷肉飯", isVegetarian: false } ``` ## 題目二:獲取陣列與物件長度 接續第一題,請修改以下程式使其打印出陣列或物件的長度。 參考文件:[MDN Array.length](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/length)、[MDN Object Keys](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) ``` =JavaScrip // Todo 待修改 console.log(toBuyList) console.log(userInfo) // Output 輸出 4 6 ``` ## 題目三:獲取陣列或物件內容 接續第一題,請將備忘錄與用戶資訊的**第一筆與最後一筆資料**給打印出來,如果是物件,須將 key 與 value 用以下範例格式打印出來。 參考文件:[MDN Object Keys](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)、[MDN Object Values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values) ``` =JavaScrip // Todo 待修改 console.log(toBuyList) console.log(userInfo) // Output 輸出 "牛奶","蘋果麵包" "age: 20 / isVegetarian: false" ``` ## 題目四:複製陣列或物件(淺拷貝) :::info 如果還沒有概念如何操作,可參考以下文檔。 * [ES6 展開語法:Spread syntax (...)](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Spread_syntax) * [物件複製:Object.assign()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) ::: JavaScript 在創建變數、賦值後除了基本型態外都是以傳址(call by refence)來去記載內容位置,雖然可以節省記憶體使用但也會造成「改 A 更動到 B」的問題。 參考資料:[Pass by value, or Pass by reference?](https://ithelp.ithome.com.tw/articles/10209104) 接續第一題,請複製一份相同的內容(使用淺拷貝的方式)到全新的陣列、物件之中。 ``` =JavaScrip // Todo 待修改 const newToBuyList = [] const newUserInfo = {} console.log(newToBuyList) console.log(newUserInfo) // Output 輸出 ["牛奶", "酪梨", "咖啡粉", "蘋果麵包"] { age: 20, name: "小明", sex: "男", hobby: ["前端開發", "讀書", "健身"], favoriteFood: "滷肉飯", isVegetarian: false } ``` ## 題目五:修改陣列與物件(增、刪、改) :::info 增、刪、改陣列或物件的方式有很多種,如還沒有概念如何操作可以參考以下文章。 * [(Ray) 關於 JavaScript 陣列 20 種操作的方法](https://israynotarray.com/javascript/20190421/1216566123/) * [(卡斯伯) JavaScript 陣列處理方法](https://www.casper.tw/javascript/2017/06/29/es6-native-array/) ::: 接續第四題,在淺複製完 ToBuyList、UserInfo 後對陣列與物件做以下的更動,並打印出來。 **陣列:** * 刪除陣列中的 "咖啡粉" * 新增 "布丁" 為陣列的首筆資料 * 刪除陣列中的最後一筆資料("蘋果麵包") **物件:** * 將小明的年齡 +1 * 將小明是否吃素改為 true * 新增 key 為 "hasDriverLiscense",value 為 true * 刪除 key "favoriteFood" ``` =JavaScrip // Todo 待編輯 // // 請在此對新物件與陣列做更動。 // console.log(newToBuyList) console.log(newUserInfo) // Output 輸出 ["布丁", "牛奶", "酪梨"] { age: 21, name: "小明", sex: "男", hobby: ["前端開發", "讀書", "健身"], isVegetarian: true hasDriverLiscense: true } ``` ## 題目六:複製陣列或物件(深拷貝) :::info 關鍵字與參考資料: * [MDN Json.prase()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) * [JSON.stringify()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) * Array Deep Clone ::: ``` =JavaScrip // Input 輸入 const nestedNumbers = [[1], [2]]; const numbersCopy = [...nestedNumbers]; numbersCopy[0].push(300); console.log(nestedNumbers, numbersCopy); // Output 輸出 // 兩個變數都被更改了,因為他們共享相同的記憶體位址來存儲資料。 [[1, 300], [2]] [[1, 300], [2]] ``` **(請先參考以上代碼了解問題點)** 在大多情況下使用淺層拷貝就足矣,但當情況稍微複雜一點(嵌套的陣列或物件),在第二層還是會出現共享記憶體位址來存儲資料的問題,造成:「更動 A 陣列也跟著改動到 B 陣列」的問題。 請創造 nestedNumbers 並深層複製出 deepCloneNestedNumbers,使其各自有獨立的記憶體位置存放資料。 ``` =JavaScrip // Todo 待編輯 const nestedNumbers = [[1], [2]]; const deepCloneNestedNumbers = [] deepCloneNestedNumbers[0].push(300) console.log(nestedNumbers, deepCloneNestedNumbers) // Output 輸出 [[1], [2]] [[1, 300], [2]] ``` ## 題目七:月有陰晴圓缺🌚🌝 :::success 先喘一口氣,接著挑戰如何使用原生方法處理陣列。通常會建議同學基本了解以下最常用的方法,就足夠應付大多場合: * [為什麼要學陣列資料處理?](https://courses.hexschool.com/courses/202011131/lectures/42391273) * [forEach](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) * [map](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Map) * [filter](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) * [reduce](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce) ::: 請製作一個函式可以回傳出月亮一周期的過程,並且在"滿月 🌕"時加上"月餅 🥮"字串。 ``` =JavaScrip // Todo 待編輯 function moonCakeTime(planetPhase) { } const moonPhase = ["🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘"] console.log(moonCakeTime(moonPhase)) // Output 輸出 ["🌑","🌒","🌓","🌔","🌕 + 🥮","🌖","🌗","🌘"] ``` ## 題目八:組合 HTML 標籤 在後續幾週的章節我們會學到如何操作網頁上的 DOM 元素,不過在此只需要先練習組合 HTML 標籤字串即可。 ``` =JavaScrip // Todo 待編輯 const cardData = [{ url: "https://www.hexschool.com/", content: "六角學院" }, { url: "https://www.heptagonschool.com/", content: "七角學院" }, { url: "https://www.Octagonschool.com/", content: "八角學院" }] const cardStructure = ` <li> <a href="#">Content</a> <li> ` const cardHTML = [] console.log(cardHTML) // Output 輸出 [" <li> <a href='https://www.hexschool.com/'>六角學院</a> <li> "," <li> <a href='https://www.heptagonschool.com/'>七角學院</a> <li> "," <li> <a href='https://www.Octagonschool.com/'>八角學院</a> <li> "] ``` ## 題目九:小餐館訂單顯示 小餐館到了中午暴增許多外送訂單,請回傳一個物件,幫助廚師紀錄目前有多少種類的食物與數量要製作。 ``` =JavaScrip // Todo 待編輯 const orders = ["🍔","🍜","🍕","🍜","🍔"]; function countOrders(orders) { // ... } console.log(countOrders(orders)) // Output 輸出 { 🍔 : 2, 🍜 : 2, 🍕 : 1 } ``` ## 題目十:代辦事項 請同學綜合以上練習,在終端中創造一個代辦事項,分別具有以下功能: * 新增事項 * 刪除事項 * 切換事項完成狀態 * 渲染事項 預期每筆事項的架構如下: ``` =JavaScrip { id: 0, // 自行決定方便的數值,有獨一無二的 ID 最好。 name: "事項名稱", isCompleted: false, } ``` ``` =JavaScrip // Todo 待編輯 let tasks = []; function addTask(task) { } function removeTask(targetId) { } function toggleTask(targetId) { } function renderTasks(tasks) { } addTask("A"); addTask("B"); addTask("C"); toggleTask(2); removeTask(1); // 可以輸入 ID 去刪除事項 renderTasks(tasks); // 輸出 [ { "id": 2, "name": "B", "isCompleted": true }, { "id": 3, "name": "C", "isCompleted": false } ] ``` ## 回報流程 1. 將答案貼在 Codepen 並複製 Codepen 連結貼至「回報區」回報 (也可以將答案直接貼至「回報區」) ![](https://i.imgur.com/vftL5i0.png) ## 作業提交等級 * LV1:解出 10 題,並提交 Codepen * LV2:設計一個 hackmd,嘗試自己設計 10 題 * LV3:嘗試去做其他學生寫的題目,並 tag 學員回報給他,感謝他的命題,讓自己觀念更好 回報區 --- | Discord | LV | CodePen / 答案 | |:-----------------------:|:---:|:--------------------------------------------------------------------------------------------------------------------------------------:| | Iris Huang#6727(範例) | LV1 | [CodePen](https://codepen.io/ythuang/pen/GRxejgE) | | Rice#8043 | LV1 | [CodePen](https://codepen.io/riecball/pen/wvjNXrq?editors=0011) | | Ayre#0016 | LV1 | [CodePen](https://codepen.io/yichunlin09/pen/BaVBmjB?editors=0010) | | Tuhacrt#0008 | LV1 | [codepen](https://codepen.io/Tuhacrt/pen/jOKNapB) | | RJRS#9430 | LV1 | [CodePen](https://codepen.io/RJRS/pen/BaVBmKB) | | Benson#6763 | LV1 | [Codepen](https://codepen.io/kumashow/pen/poKzdNN) | | VT#0895 | LV1 | [CodePen](https://codepen.io/vt197/pen/ZERzryY) | | YC#2522 | LV1 | [CodePen](https://codepen.io/YCLu/pen/eYKOGjz) | | 柔柔#1716 | LV1 | [Codepen](https://codepen.io/rouchen/pen/OJELQrq?editors=0011) | | hsiung阿熊#4079 | LV1 | [Codepen](https://codepen.io/hsiungchi/pen/OJELOoM) | | 威爾#1694 | LV1 | [CodePen](https://codepen.io/WILL_Wu/pen/eYKOyJL) | | yawun#0042 | LV1 | [CodePen](https://codepen.io/monicalin/pen/mdKbqgJ) | | Mylène#2481 | Lv1 | [CodePen](https://codepen.io/hamajibashi/pen/rNKBpzP) | | 無名#6427 | Lv1 | [CodePen](https://codepen.io/Nomoney/pen/WNyeXjw?editors=0011) | | Cliff#4606 | LV1 | [Codepen](https://codepen.io/Cliff_hex/pen/VwdZyKL) | | Sentiments#4883 | Lv1 | [codepen](https://codepen.io/Sentiments/pen/PoaYeGb?editors=0011) | | SASIMI#5099 | Lv1 | [Codepen](https://codepen.io/sashimi1327/pen/MWXgGQz) | | 法希娜#3206 | Lv1 | [Codepen](https://codepen.io/yiiserpf-the-encoder/pen/WNyeZqN?editors=0012) | | jacky010080#0880 | Lv1 | [CodePen](https://codepen.io/Yen-Jung-Chen/pen/MWXgrWV?editors=0011) | | Ohno#1144 | Lv1 | [Codepen](https://codepen.io/mmaa7850/pen/OJELZBO?editors=0011) | | Paul#7426 | Lv1 | [CodePen](https://codepen.io/paul-1997/pen/ExRYRog?editors=0011) | | Amberhh#2465 | Lv1 | [Codepen](https://codepen.io/Amberhh/pen/OJELONK?editors=0011) | | jackson204#6363 | Lv1 | [Codepen](https://codepen.io/jackson204/pen/poKzOpZ?editors=1111) | | AuroraC#6539 | LV1 | [codepen](https://codepen.io/AuroraC/pen/GRGKQOG?editors=1012) | | 圈圈#4060 | LV2 | [Codepen](https://codepen.io/wjejfczn-the-bold/pen/PoaYeWW?editors=1012)/[HackMD](https://hackmd.io/@j6ccRYgTTEiVcfMfmAELcw/B1ROauSVi) | | 出事了阿伯#9923 | Lv1 | [Codepen](https://codepen.io/BradpittLai/pen/bGKbLJX?editors=1011) | | jimmyFang#9575 | Lv1 | [Codepen](https://codepen.io/pohxiqqo/pen/dyKbwLp?editors=0011) | | 黃士桓#7654 | Lv1 | [codePen](https://codepen.io/shr-huan-huang/pen/rNKBPmV?editors=0012) | | RyanTsai#8906 | Lv1 | [CodePen](https://codepen.io/linlaose/pen/yLEBvVm) | | 威0#6919 | LV1 | [Codepen](https://codepen.io/n0918679182/pen/GRGKOap?editors=0012) | | PayRoom#8328 | LV1 | [CodePen](https://codepen.io/water38198/pen/rNKBGZM) | | yumy#1940 | LV1 | [CodePen](https://codepen.io/yumy_yamg/pen/gOKYoOr) | | JackC#0411 | LV1 | [CodePen](https://codepen.io/key0329/pen/QWxLQwz) | | mandylai#4055 | LV1 | [CodePen](https://codepen.io/mandy-lai-2/pen/rNKBdyG) | | mandylai#4055 | LV1 | [CodePen](https://codepen.io/mandy-lai-2/pen/rNKBdyG) | | William Lai#0196 | LV1 | [CodePen](https://codepen.io/lai-weihan/pen/WNyeJOd) | | Kimi #9564 | LV1 | [CodePen](https://codepen.io/kimihu91/pen/KKePRGG) | | albee#9121 | LV1 | [Codepen](https://codepen.io/albee-chang/pen/xxzKNRO?editors=1012) | | hannahTW#2224 | LV3 | [Codepen](https://codepen.io/hangineer/pen/xxzKeVB?editors=0011)/[HackMd](https://hackmd.io/@XuLchNweTiC4s2NZlAlQDw/H169I-nNo) | | suihsilan#9485 | LV1 | [Codepen](https://codepen.io/suihsilan/pen/XWYWBpM?editors=0010) | | yoshidc#0455 | LV1 | [Codepen](https://codepen.io/yoshiyyc/pen/GRGRoLm) | | kenki100#0068 | LV1 | [Codepen](https://codepen.io/ken100/pen/vYrYgxQ) | | 黑白兔#0684 | LV1 | [Codepen](https://codepen.io/johnny329/pen/poKoWPB) | | Ron Liang#7277 | LV1 | [Codepen](https://codepen.io/ron-go/pen/bGKNwjW) | | CloThEs#7837 | LV1 | [Codepen](https://codepen.io/CloThEsZ/pen/gOKbvPm) | | Rena#6249 | LV1 | [Codepen](https://codepen.io/aureate0116/pen/XWYryBE?editors=0012) | | charlottelee849#0366 | LV1 | [Codepen](https://codepen.io/charlotte-lee/pen/dyKPmde?editors=0010) | | 萱仔#0781 | LV1 | [Codepen](https://codepen.io/ting-hsuan/pen/RwJbeMy?editors=0011) | | LHchien33#6232 | LV1 | [Codepen](https://codepen.io/lin_chien/pen/vYrBdRR?editors=0012) | | amy芳#1385 | LV1 | [Codepen](https://codepen.io/amy-chieng/pen/NWzPLxN) | | KuoMin#4931 | LV1 | [Codepen](https://codepen.io/KuoMin/pen/vYrOXZw) | | Yiru#0236 | LV1 | [Codepen](https://codepen.io/yiru94/pen/bGKNLKj?editors=0011) | | Kevin#6131 | LV1 | [Codepen](https://codepen.io/xlqjezvc-the-encoder/pen/OJEJRGx) | | 薯餅#3581 | LV1 | [Codepen](https://codepen.io/ColdingPoTaTo/pen/dyKbLqG) | | Lucie#3831 | LV1 | [Codepen](https://codepen.io/bisespei/pen/abKbvvy) | yoyo#1003 | LV1 | [Codepen](https://codepen.io/crpbugqy-the-typescripter/pen/yLENWzq) | 蓁心#6229 | LV1 | [Codepen](https://codepen.io/tlorfrnl-the-typescripter/pen/ZERzwNO?editors=0011) | 雷雷#7844 | LV1 | [Codepen](https://codepen.io/lei-yi-jie/pen/poKJmOO?editors=0010) | JustinLiu#9699 | LV1 | [CodePen](https://codepen.io/justin0227/pen/OJEPPwW?editors=0011) | WEI_RIO#9342 | LV1 | [codepen](https://codepen.io/wei_wu/pen/bGKbYOB?editors=0011) | Winnie#1306 | LV1 | [codepen](https://codepen.io/WinnieWuWinnie/pen/wvXwXbL) | 安o #2448 | LV1 | [codepen](https://codepen.io/JzhenAn/pen/LYrpEbm?editors=1011) | YU#0618 | LV1 | [Codepen](https://codepen.io/yoken_/pen/zYaOLaj) | | | cotton#7163 | LV1 | [Codepen](https://codepen.io/cottonT/pen/bGKbvzB) | | | 艸良#2846 | LV1 | [Codepen](https://codepen.io/momoninainai/pen/ExRVLzL?editors=1111) | | | Greta#0837 | LV1 | [CodePen](https://codepen.io/gretali/pen/ExRxywo)| | 心幻羽#0056 | LV1 | [CodePen](https://codepen.io/linglingsyu/pen/wvXwmaw?editors=1011) | | | sophiee#7015 | LV1 | [codepen](https://codepen.io/sophiee2727/pen/MWXazVN) | | | IreneY#0086 | LV1 | [codepen](https://codepen.io/HalfPlannedJourney/pen/MWXaxJR) | | | Eileen#6454 | LV1 | [codepen](https://codepen.io/Eileen-io/pen/qBKdGoB) | | | hungya#0773 | LV1 | [codepen](https://codepen.io/hungya777/pen/abKdpOe?editors=0011) | | yen#5757 | LV1 | [codepen](https://codepen.io/TZU-HUANG-YEN/pen/zYaOmQZ?editors=1111) | | | Clara#1275 | LV1 | [codepen](https://codepen.io/bsupixqu/pen/KKePJxP?editors=0011) | | | Chloe#5422 | LV1 | [CodePen](https://codepen.io/Ironchloe/pen/XWYJxVv?editors=0011) | | yaru#6308 | LV1 | [CodePen](https://codepen.io/lszaietc/pen/OJENJPp?editors=0010) | | | 三隻小貓#1905 | LV1 | [CodePen](https://codepen.io/bagelover/pen/dyKPgXY) | | | FiReBrO#0557 | LV1 | [CodePen](https://codepen.io/firebro42/pen/ZERWzEK?editors=0011) | | | Rr#2215 | LV1 | [Codepen](https://codepen.io/rufangcheng/pen/GRGJbwX) | | Hilda#7085 | LV1 | [CodePen](https://codepen.io/vwquikad-the-vuer/pen/PoaoNdd) | | Vera#5592 | LV1 | [CodePen](https://codepen.io/skvera/pen/qBKWzmK) | | 大大#5164 | LV1 | [CodePen](https://codepen.io/gzonothk-the-looper/pen/wvXMGgW?editors=0011) | |我是泇吟#5189|LV1|[CodePen](https://codepen.io/kljuqbxs/pen/dyKMKYj)| |ssozr#4680|LV1|[codepen](https://codepen.io/ssozr/pen/bGKbKOy?editors=0011)| |Data#9297|LV1|[codepen](https://codepen.io/kirakira72/pen/qBKWPLV)| |Yuna Huang#2692|LV1|[codepen](https://codepen.io/Yuna1002/pen/JjZYbQd?editors=0011)| | m_m#5493 | LV1 | [CodePen](https://codepen.io/minnn7716/pen/GRGNOoL) | |軟綿綿 (๑•ᴗ•๑) ♡#3627|LV1|[CodePen](https://codepen.io/Connie-Chien/pen/mdKOpvw?editors=0012)| |王懷英#7271|LV1|[CodePen](https://codepen.io/huaiying/pen/qBKZYPm) |Hazel.#6020|LV1|[CodePen](https://codepen.io/Hazelhsieh/pen/MWXgErw?editors=1011)| |Ryan Chiang#6649|LV1|[Codepen](https://codepen.io/ryanchiang/pen/qBKXZBJ?editors=0012)| |kuku#3118|LV1|[Codepen](https://codepen.io/mengting-ku/pen/ExRwoBv) | Tami#6742 | LV1 | [CodePen](https://codepen.io/wqsdqbjn-the-vuer/pen/abRKPOG) |