<aside> 🚧 以下內容尚未修改

</aside>

陣列 / array

前面的例子假設標準答案只有一個,但如果題目是「請列出一個鹼金屬元素」、「請列出一個鹼土金屬元素」、「請列出一個稀有氣體」,要如何利用程式檢查使用者的答案是否正確? 也就是,標準答案不只一個,而且,只要回答其中一個就好,那要怎麼辦?

function checkAnswer(
      q,
      answer1,
      answer2,
      answer3,
      answer4,
      answer5,
      answer6
    ) {
      let myAnswer = prompt(q);
      if (
        myAnswer == answer1 ||
        myAnswer == answer2 ||
        myAnswer == answer3 ||
        myAnswer == answer4 ||
        myAnswer == answer5 ||
        myAnswer == answer6
      ) {
        alert("正確");
      } else {
        alert("錯誤");
      }
    }
    checkAnswer("請列出一個鹼金屬元素", "鋰", "鈉", "鉀", "銣", "銫", "鍅");
    checkAnswer("請列出一個鹼土金屬元素", "鈹", "鎂", "鈣", "鍶", "鋇", "鐳");
    checkAnswer("請列出一個稀有氣體", "氦", "氖", "氬", "氪", "氙", "氡");

上面這個範例不會有問題,是因為正好這三個題目的答案都是六個,那如果答案不一定是六個呢? 那就需要用到陣列。在javascript裡,可以利用中括號([])來代表一個陣列,這樣,就可以把多個值指定給一個變數。

checkAnswer("請列出一個鹼金屬元素", **[**"鋰", "鈉", "鉀", "銣", "銫", "鍅"**]**);

這會有什麼好處呢? 函數的參數就可以精簡成:

function checkAnswer(q, **answers**) {
}

取得陣列的內容就可以改成:

      if (
        myAnswer == answers[0] ||
        myAnswer == answers[1] ||
        myAnswer == answers[2] ||
        myAnswer == answers[3] ||
        myAnswer == answers[4] ||
        myAnswer == answers[5]
      ) {
        alert("正確");
      } else {
        alert("錯誤");
      }

可是,這沒有解決萬一答案個數不一樣的問題。要能夠因應答案個數不一樣,那就要利用陣列的長度 (answers.length),根據長度去檢查每一個元素的內容。要取得陣列裡的資料 ,可以透過中括號裡的值,這個值稱為索引值,索引值從0(而不是1)開始,當我們利用i來做為索引值:

      **for (i = 0; i < answers.length; i++){**
        if (myAnswer == answers**[i]**){
          
        }
      **}**

接下來,怎麼知道輸入的內容跟任何一個答案相同呢? 我們先設定一個變數correct,內容為0,當答案相同時,設定變數內容為1。當迴圈結束時,如果correct的內容是1,就知道輸入的內容跟其中一個答案相同。

    function checkAnswer(q, answers) {
      let myAnswer = prompt(q);
      **let correct = 0;**
      for (i = 0; i < answers.length; i++){
        if (myAnswer == answers[i]){
          **correct =1;**
        }
      }
      if(correct == 1) {
        alert("正確");
      } else {
        alert("錯誤");
      }
    }
    checkAnswer("請列出一個鹼金屬元素", ["鋰", "鈉", "鉀", "銣", "銫", "鍅"]);
    checkAnswer("請列出一個鹼土金屬元素", ["鈹", "鎂", "鈣", "鍶", "鋇", "鐳"]);
    checkAnswer("請列出一個稀有氣體", ["氦", "氖", "氬", "氪", "氙", "氡"]);

因為這樣的使用情境經常會發生,所以,陣列提供了內建的方法(includes)來處理:

    function checkAnswer(q, answers) {
      let myAnswer = prompt(q);
      if (**answers.includes(myAnswer)**) {
        alert("正確");
      } else {
        alert("錯誤");
      }
    }
    checkAnswer("請列出一個鹼金屬元素", ["鋰", "鈉", "鉀", "銣", "銫", "鍅"]);
    checkAnswer("請列出一個鹼土金屬元素", ["鈹", "鎂", "鈣", "鍶", "鋇", "鐳"]);
    checkAnswer("請列出一個稀有氣體", ["氦", "氖", "氬", "氪", "氙", "氡"]);

物件 / Object