この解答例は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}