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

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

以下が自分で実装したコードです。

function flat(arr, depth = 1) {
  if (depth === 0) {
    return arr.slice();
  }

  return arr.reduce((acc, val) => {
    if (Array.isArray(val)) {
      acc.push(...flat(val, depth - 1));
    } else {
      acc.push(val);
    }
    return acc;
  }, []);
}

再帰を使って配列を再帰的に探索しています。もしdepthが0になったら配列をそのまま返し、それ以外の場合はreduceで配列を走査しながら、配列要素かどうかを判断し再帰的に処理するか、またはそのまま結果に追加します。

次に再帰を使わないでの実装について考えてみます。

以下は再帰を使わずに実装したコードです。

function flat(arr, depth = 1) {
  let result = [];
  let list = [arr];
  let d = depth;

  while (list.length && d >= 0) {
    let temp = list.pop();
    d--;

    for (let i = 0; i < temp.length; i++) {
      let item = temp[i];
      if (Array.isArray(item)) {
        list.push(item);
      } else {
        result.push(item);
      }
    }
  }

  return result;
}

こちらはwhileループを使って配列を探索し、スタックを利用して処理を行っています。list変数に配列を格納して、それを順番に処理していきます。もし配列要素が配列だった場合はスタックに追加し、それ以外の場合は結果に追加します。depthが指定されている場合は、ループ内でdをデクリメントしてその値が0になったらループを終了させます。

このように、再帰を使わずに実装することもできますが、スタックを利用するためにメモリを多く消費する可能性があるため注意が必要です。また、再帰を使った実装には見劣りするかもしれませんが、効率的に動作することが確認されています。