# 第三週課程重點筆記 ###### tags: `JS 課程重點筆記` `2021` `JS直播班` `秋季班` `六角學院` ## :mag_right: 陣列與物件的功能 ``` 運用陣列、物件可定義資料結構,概念類似於 Excel,也能篩選、排序資料...。 ``` ## :mag_right: 學習陣列與物件的目的 ### 假設手上有多筆變數資料,該如何更有效率去管理? ````javascript = let color1 = "yellow"; let color2 = "pink"; let color3 = "red"; ... ... ... ```` ## :mag_right: 陣列 ### :dart: 結構 - **順序(序列)**:用來取得資料的「位置」 - **值**:有不同型別 ### :dart: 宣告陣列 (基本樣式) ```javascript = let colors = ["yellow", "pink", "red"]; ``` - 陣列適用於**集合**資料 - 陣列內的每一筆都是「型別資料」 ### :dart: 陣列取值 ```javascript = let colors = ["yellow", "pink", "red"]; console.log(colors[0]); // 讀取到第1筆,"yellow" console.log(colors[1]); // 讀取到第2筆,"pink" console.log(colors[2]); // 讀取到第3筆,"red" // 在陣列中,第一筆資料是由 0 開始起算的 ``` ### :dart: 陣列賦值 ```javascript= array.push({hobby: 'go shopping'}); //array.push() // method 方法 //push() 是專門給陣列用的方法,資料放在陣列最後一筆 ``` ### :dart: 陣列長度 ```javascript = let colors = ["yellow", "pink", "red"]; console.log(colors.length); // 回傳 3 反推: console.log(colors[colors.length]); // 回傳 undefined,因為 3 代表陣列中第四筆資料,目前未查詢得到 ``` ### :dart: 陣列長度----抓陣列中最後 1 筆資料 ```javascript = let colors = ["yellow", "pink", "red"]; console.log(colors[colors.length-1]); // 回傳 "red" ``` ### :dart: 修改陣列:push、unshift、pop、splice :::warning :warning: 由於陣列是有**序列性**的結構,因此輸入的資料也有**順序性**。 ::: #### :one: push(); 最後方、新增 ```javascript = let colors = ["yellow", "pink", "red"]; colors.push("blue"); console.log(colors); // 回傳 ["yellow", "pink", "red", "blue"] ``` #### :two: unshift(); 最前方、新增 ```javascript = let colors = ["yellow", "pink", "red"]; colors.unshift("green"); console.log(colors); // 回傳 ["green", "yellow", "pink", "red"] ``` #### :three: pop(); 最後方、刪除 ```javascript = let colors = ["yellow", "pink", "red"]; colors.pop("red"); console.log(colors); // 回傳 [yellow", "pink"] ``` #### :four: splice(); 指定位置、刪除 ```javascript = let colors = ["yellow", "pink", "red"]; colors.splice(1, 1); // splice(指定資料的位置, 數量) console.log(colors); // 回傳 [yellow", "red"] //適用於刪除資料中隨機一筆的位置,例如:todolist、DOM ``` :::success :bulb: **使用 push 或 unshift 的時機?** - **push:** 要指定新增的資料會出現在最上頭的,**例如:最新消息** - **unshift:** 要指定新增的資料在最後一筆的,**例如:排名、搶頭香** ::: ## :mag_right: 物件 ### :dart: 結構 - **屬性(key)**:用來取得資料的「位置」 - **值(value)**:有不同型別 ``` 在物件內,沒有順序性,只有屬性名稱與值。 ``` ### :dart: 宣告物件 ```javascript = let personal = { // 屬性 值(value) name: "廖洧杰", price: 3000, height: 179, weight: 68, } ``` **使用時機:記述詳細資訊** ### :dart: 讀取物件的屬性 (造訪資料) ```javascript = let personal = { // 屬性 值(value) name: "廖洧杰", price: 3000, height: 179, weight: 68, } console.log(personal.name) // "廖洧杰" console.log(personal.height) // 179 ``` ### :dart: 新增物件的屬性 ```javascript = let personal = { // 屬性 值(value) name: "廖洧杰", price: 3000, height: 179, weight: 68, } personal.pc = "Mac M1 Max" console.log(personal); // 回傳 {name: "廖洧杰", price: 3000, height: 179, weight: 68, pc: "Mac M1 Max"} ``` :::warning :warning: **新增物件的屬性 & 修改物件屬性內的值** :warning: 看起來都是用一樣的方法,但概念上有點不同。 一個是新增一個全新的屬性到物件內、一個是修改物件原有屬性的值。 ::: ### :dart: 重新賦予物件的值 ```javascript = let personal = { // 屬性 值(value) name: "廖洧杰", price: 3000, height: 179, weight: 68, pc: "Mac M1 Max" } //語意:花了3000元買電腦 personal.price -= 3000; //語意:增加購買條件 Mac M1 Max Ram36GB版 personal.pc += "Ram36GB版" ``` ### :dart: 物件取值:有兩種方式 ```javascipt= let obj = { myName:"洧杰", price:3000, 0:"2000" } // 第一種 obj.myName // 第二種 obj["myName"] // 使用時機:遇到容易出錯的字、不允許讀取的狀態 console.log(obj["0"]) // '2000' // 使用時機:可以帶入變數(把屬性名稱存起來) let thatName = "myName" console.log(obj[thatName]) //"洧杰" ``` ### :dart: 試題演練 ``` javascript= let jsLiveClass = { day: "Mon", week: 3, }; 想要新增一個屬性為「0」,值為「false」的資料,下列方式何者正確 1. jsLiveClass.0 = false; 2. jsLiveClass["0"] = false; 3. jsLiveClass."0" = false; 想要將屬性「day」更新值為「Fri」,下列方式何者正確 1. day = "Fri"; 2. jsLiveClass[day] = "Fri"; 3. jsLiveClass.day = "Fri"; Ans: 2, 3 ``` ## :mag_right: 陣列與物件整合運用 ### :dart: 陣列與物件使用時機 * 陣列:當資料需要使用大量且同性質的資料 * 物件:要描述一個東西對應的特徵和行為 > 寫程式永遠沒有正確解答 > **只有符合情境的程式邏輯** :heavy_check_mark: ### :dart: 資料集取值 看到物件就用`.`來讀取屬性,看到陣列就用`[ ]`取值 ```javascript= let ubike = { contentType: "application/json", isImage: false, data: { retCode: 1, updated_at: "2021-10-22 21:40:24", retVal: [ { scity: "高雄市", scityen: "Kaohsiung City", sna: "YouBike2.0_七賢國中(美術東四路)", sarea: "鼓山區", ar: "美術東四路/美術東五路(西南側)", snaen: "YouBike2.0_Cisian junior high school", sareaen: "Gushan Dist", aren: "Meishu E. 4th Rd./Meishu E. 5th Rd.(Southwest)", sno: "501209087", tot: "21", sbi: "1", mday: "20211022211419", lat: "22.65871", lng: "120.29012", bemp: "20", act: 1 }, ] } } // 取 sna console.log(ubike.data.retVal[0].sna) ``` ## :mag_right: 類陣列 case 1 ```javascript= let firstName = 'Karen'; console.log(firstName[0]) // 結果為 'K' // 字串雖然屬於類陣列: // 類陣列雖然可以用陣列方法取到值。 // 類陣列物件的格式與陣列結構類似,有 length 屬性,可以通過 index 來訪問或設定裡面的元素, // 但不能用陣列方法(forEach, filter...)。 ``` case 2: NodeList ```htmlembedded= <p>Click the button to change the text of this paragraph.</p> <p>This is also a paragraph.</p> <button onclick="myFunction()">Try it</button> ``` ```javascript= function myFunction() { document.getElementsByTagName("P")[0].innerHTML = "Hello World!"; document.getElementsByTagName("P")[1].innerHTML = "Hello there!"; } ``` ## :mag_right: indentify property, key, and value ```javascript= let obj = { 'key1': value1, // 這個 pair 就是 property 'key2': value2, // 這個 pair 就是 property 'key3': value3 // 這個 pair 就是 property } ```