# 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 秋季班` `六角學院`