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

BFE.devでのAI解答例 - JavaScript コーディング問題
156. `_.set()`を実装してください

以下はJavaScriptでの_.set()の実装例です。

function set(obj, path, value) {
  if (typeof path === 'string') {
    path = path.split(/\.|\[(\d+)\]/).filter(Boolean); // ドット「.」あるいは[数字]でパスを分割して、空文字列を除去
  }
  let current = obj;
  for (let i = 0; i < path.length - 1; i++) {
    const key = path[i];
    const nextKey = path[i + 1];
    const isArrayIndex = /^\d+$/.test(nextKey); // 次のキーが数字の場合、配列要素として扱う
    if (current[key] === undefined) {
      current[key] = isArrayIndex ? [] : {};
    }
    current = current[key];
  }
  current[path[path.length - 1]] = value;
  return obj;
}

主な処理は以下の通りです。

  1. パスが文字列の場合は、ドット「.」あるいは[数字]でパスを分割して、空文字列を除去します。
  2. オブジェクトである「obj」とパスの各要素を順番にたどり、次の要素が配列要素かどうかでオブジェクトと配列を切り替えていきます。
  3. オブジェクト、配列が存在しない場合、適切なオブジェクト、配列を作成します。
  4. パスの最後の要素に値をセットします。

また、数字の前に0が含まれる場合は不正な数値として扱われるため、プロパティ文字列として処理されます。

set(obj, 'a.c.d.01', 'BFE')
// invalid digits treated as property string
console.log(obj.a.c.d['01']) // "BFE"

数字であっても、2桁以上の場合は配列要素として扱えます。

set(obj, 'a.c.d[01]', 'BFE')
// valid digits treated as array elements
console.log(obj.a.c.d[1]) // "BFE"

注意点として、引数で与えたオブジェクト自体が書き換わってしまうため、注意して利用する必要があります。