JavaScript 程式碼重構挑戰 (100 分)

題目 1 (25 分): 陣列求和重構

請將舊式 `for` 迴圈重構成使用 ES6+ 語法中最簡潔且優雅的方法。

原始程式碼 (待重構)

function calculateSum(array) {
  var total = 0;
  for (var i = 0; i < array.length; i++) {
    total = total + array[i];
  }
  return total;
}

您的重構程式碼

題目 2 (25 分): 陣列過濾與轉換

請重構以下函式,它必須過濾掉陣列中的**偶數**,並將剩下的**奇數乘以 2**。請使用現代陣列方法 (`filter`, `map`) 實作。

原始程式碼 (待重構)

function processArray(arr) {
    let result = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] % 2 !== 0) { // 奇數
            result.push(arr[i] * 2);
        }
    }
    return result;
}

您的重構程式碼

題目 3 (25 分): 物件解構與字串模板

請寫一個函式,接收一個包含 `firstName`、`lastName` 和 `role` 屬性的使用者物件。函式應使用 **物件解構 (Destructuring)** 和 **字串模板 (Template Literals)** 返回一個格式化的歡迎訊息。

原始程式碼 (待重構)

function greetUser(user) {
    var first = user.firstName;
    var last = user.lastName;
    var role = user.role;
    return "Hello, " + first + " " + last + "! Your role is " + role + ".";
}

您的重構程式碼

題目 4 (25 分): 異步編程:實現延遲函式

請寫一個名為 `delay(ms)` 的函式,它接受一個毫秒數 (`ms`) 作為參數。這個函式必須返回一個 **Promise**,並在指定的毫秒數後解決 (resolve)。

原始程式碼 (概念錯誤範例)

// 這是無法正確實現延遲的錯誤範例:
function delay(ms) {
    setTimeout(function() {
        console.log(ms + "ms passed");
    }, ms);
    // 這裡會立即返回 undefined,而非 Promise
}

您的重構程式碼