// 解法 1. 最簡潔
const compose = (fs) => (x) => fs.reduceRight((a, f) => f(a), x);
// 解法 2. 好懂
const compose = function (functions) {
  return function (x) {
    for (let i = functions.length - 1; i >= 0; i--) {
      x = functions[i](x);
    }
    return x;
  };
};
這題考的是實作 functional programming 的 compose,第二個解法的 reduceRight 改成 reduce 就是 pipe,讀者可以自行搜尋這兩種函式。
要解開題目就是將傳入的陣列參數內的多個函式都執行一次,記得每次計算後的結果要儲存,最後回傳最終計算結果即可。
時間複雜度: O(n)
空間複雜度: O(1)
解法 1.
var timeLimit = function (fn, t) {
  return async function (...args) {
    return new Promise((resolve, reject) => {
      let timeId = setTimeout(() => {
        reject('Time Limit Exceeded');
      }, t);
      fn(...args)
        .then((res) => resolve(res))
        .catch((err) => reject(err))
        .finally(() => clearTimeout(timeId));
    });
  };
};
解法 2.
var timeLimit = function (fn, t) {
  return async function (...args) {
    const promiseFn = fn(...args);
    const timeLimitPromise = new Promise((_, reject) => {
      setTimeout(() => {
        reject('Time Limit Exceeded');
      }, t);
    });
    return Promise.race([promiseFn, timeLimitPromise]);
  };
};
看題目描述會需要處理到非同步函式的 resolve、reject 情況,只要超過時間限制就會 reject,這種情況可以想到使用 Promise,所以解法 1 中去 return 一個 Promise,裡面就可以處理 resolve、reject,reject 會在時間限制到時觸發,而 resolve 就依照非同步的 fn 處理。
解法 2 使用 Promise.race(),它接受一個包含 Promise 當作元素的陣列,只回傳傳入的 Promie 陣列中第一個被 resolve/reject 的 Promise 物件。所以我們將原本的非同步函式、會 reject 的 Promise 物件加到 Promise.race() 內,先執行完成的 Promise 就會被回傳。
var createCounter = function (init) {
  let count = 0;
  return {
    increment() {
      return init + ++count;
    },
    decrement() {
      return init + --count;
    },
    reset() {
      count = 0;
      return init;
    },
  };
};
就是考閉包的應用
時間複雜度: O(1)
空間複雜度: O(1)
var expect = function (val) {
  return {
    toBe: (checkVal) => {
      if (val === checkVal) {
        return true;
      } else {
        throw new Error('Not Equal');
      }
    },
    notToBe: (checkVal) => {
      if (val !== checkVal) {
        return true;
      } else {
        throw new Error('Equal');
      }
    },
  };
};
可以 Google function chaining
時間複雜度: O(1)
空間複雜度: O(1)