# week4 該來闖關了啦😏 ## 請描述此段[程式碼](https://codepen.io/hexschool/pen/VwmGZBd?editors=1010),哪裡用到物件 push 與取值概念、寫第四關主線任務破關流程 ```javascript= // 程式碼 // 小步測試,反覆驗證 let bmiHistoryData = []; const bmiStatesData = { "overThin": { "state": "過輕", "color": "藍色" }, "normal": { "state": "正常", "color": "紅色" }, "overWeight": { "state": "過重", "color": "澄色" }, "mildFat": { "state": "輕度肥胖", "color": "黃色" }, "moderateFat": { "state": "中度肥胖", "color": "黑色" }, "severeFat": { "state": "重度肥胖", "color": "綠色" }, } function bmiStatesText(state) { console.log(`您的體重${bmiStatesData[state].state},健康指數為${bmiStatesData[state].color}`) } // 這裡在作 log 使用物件動態取值從 function 帶入的參數, // 所對應的物件屬性名,取得所屬的值 function addData(bmi,state){ let obj = {}; obj.bmi = bmi; obj.state = state; bmiHistoryData.push(obj); } // 這裡做了使用創建空物件並使用物件取值並賦予參數傳入的值, // 跟使用 push 的方法新增到歷史紀錄的陣列之中 function printBmi(height, weight) { // let height = 178; // let weight = 130; let bmi = (weight / ((height / 100) * (height / 100))).toFixed(2); // console.log(bmi); if (bmi < 18.5) { addData(bmi, "overThin") //overThin bmiStatesText("overThin"); } else if (18.5 <= bmi && bmi < 24) { //normal bmiStatesText("normal"); addData(bmi, "normal"); } else if (24 <= bmi && bmi < 27) { //overWeight bmiStatesText("overWeight"); addData(bmi, "overWeight"); } else if (27 <= bmi && bmi < 30) { //mildFat bmiStatesText("mildFat"); addData(bmi, "mildFat"); } else if (30 <= bmi && bmi < 35) { //moderateFat bmiStatesText("moderateFat"); addData(bmi, "moderateFat") } else if (bmi >= 35) { //severeFat bmiStatesText("severeFat"); addData(bmi, "severeFat") } else { console.log("您的數值輸入錯誤,請重新輸入") } } // 這裡計算並使用數字型別的.toFixed方法算出最多小數2位的結果, // 根據計算結果帶入 addData 方法並新增至歷史紀錄陣列中與帶入 // bmiStatesText 方法,並秀出結果在log上 function showHistoryData(){ const totalNum = bmiHistoryData.length; const lastNum = totalNum - 1; const lastState = bmiHistoryData[lastNum].state console.log(`您總共計算 ${totalNum} 次 BMI 紀錄,最後一次 BMI 指數為 ${bmiHistoryData[lastNum].bmi},體重${bmiStatesData[lastState].state}!健康指數為${bmiStatesData[lastState].color}!`); } // 這裡創建一個存放歷史紀錄長度的變數使用陣列取 length 方法, // 並算出了這個陣列的長度 // 並計算出最後一筆的序號,使用陣列取值的方法並取得最後一筆的物件, // 並使用物件取值的方法,拿到該筆物件各個屬性的值 // 輸入數據,顯示對應物件內容 printBmi(178, 20); printBmi(178, 70); printBmi(178, 85); showHistoryData(); ``` ## 寫在結尾 如果說到要優化的地方,除了改寫成箭頭函式大概就只有判斷地方改成三元了吧😵‍💫 看不太出來還有什麼地方可以優化的😲 ###### tags: `Javascript` `JS 直播班 - 2021 秋季班` `六角學院`