---
# System prepended metadata

title: "week4 該來闖關了啦\U0001F60F"
tags: [Javascript, 六角學院, JS 直播班 - 2021 秋季班]

---

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