この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。

BFE.devでのAI解答例 - JavaScript コーディング問題
12. Immutability helperを実装する

以下はJavaScriptで実装したImmutability Helperの例です。

function update(obj, spec) {  if (spec.$push) {    return [...obj, ...spec.$push]  } else if (spec.$set !== undefined) {    return spec.$set  } else if (spec.$merge) {    return {...obj, ...spec.$merge}  } else if (spec.$apply) {    return spec.$apply(obj)  } else if (Array.isArray(obj)) {    return obj.map((item, index) => {      if (index in spec) {        return update(item, spec[index])      } else {        return item      }    })  } else {    let newObj = {}    for (let key in obj) {      if (key in spec) {        newObj[key] = update(obj[key], spec[key])      } else {        newObj[key] = obj[key]      }    }    return newObj  }}

このImmutability Helperは、与えたオブジェクトと変更内容のspecを受け取り、変更を加えた新しいオブジェクトを返します。実装の詳細は次のとおりです。

まず、$pushがある場合は、配列の要素をオブジェクト全体を展開することで追加します。

if (spec.$push) {  return [...obj, ...spec.$push]}

次に、$setがある場合は、単純に$setで指定された値を返します。

else if (spec.$set !== undefined) {  return spec.$set}

$mergeがある場合は、スプレッド演算子を使用して新しいオブジェクトを生成します。

else if (spec.$merge) {  return {...obj, ...spec.$merge}}

$applyがある場合は、関数を適用して新しいオブジェクトを返します。

else if (spec.$apply) {  return spec.$apply(obj)}

次に、配列の場合は、各要素に再帰的にupdate関数を適用し、変更がある場合はその要素を新しいオブジェクトに含めます。

else if (Array.isArray(obj)) {  return obj.map((item, index) => {    if (index in spec) {      return update(item, spec[index])    } else {      return item    }  })}

最後に、オブジェクトの場合は、各キーに再帰的にupdate関数を適用し、変更がある場合はそのキーと値を新しいオブジェクトに含めます。

else {  let newObj = {}  for (let key in obj) {    if (key in spec) {      newObj[key] = update(obj[key], spec[key])    } else {      newObj[key] = obj[key]    }  }  return newObj}