この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
122. memoizeOne() を実装する

以下はJavaScriptのmemoizeOne()関数の実装例です。

function memoizeOne(func, isEqual = defaultIsEqual) {
  let lastArgs = null;
  let lastResult = null;

  function memoized(...newArgs) {
    if (!isEqual(lastArgs, newArgs)) {
      // 引数が前回と異なる場合、結果を再計算する
      lastResult = func(...newArgs);
    }

    lastArgs = newArgs;
    // 同じ引数が与えられた場合はキャッシュされた結果を返す
    return lastResult;
  }

  return memoized;
}

function defaultIsEqual(prevArgs, newArgs) {
  if (prevArgs === null) {
    return false;
  }

  if (prevArgs.length !== newArgs.length) {
    return false;
  }

  for (let i = 0; i < prevArgs.length; i++) {
    if (prevArgs[i] !== newArgs[i]) {
      return false;
    }
  }

  return true;
}

この関数は、与えられた関数と引数の等価性を比較するためのequal関数(デフォルトは上記のdefaultIsEqual関数)を使用して、戻り値をキャッシュしています。

もし、引数が前回と違う場合には、結果を再計算することで、関数の再呼び出しを避けています。isEqual関数がnullか未定義の場合、配列の要素に対してstrict equal ===で比較するデフォルトのequal関数が使用されます。