この解答例はChatGPTによって生成されています,正しいかは自己判断で。
BFE.devでのAI解答例 - JavaScript コーディング問題
164. Immerのproduce()を実装してください
以下はJavaScriptでのImmerのproduce()関数の実装です。
function produce(baseState, producer) {
// 1. deep shallow clone for baseState
let currentState = Array.isArray(baseState) ? [...baseState] : {...baseState};
// 2. create a draft proxy based on the currentState
let draft = currentState;
// 3. invoke the producer callback with the draft state
producer(draft);
// 4. return the copy of the currentState with the changes from the draft applied
return currentState;
}
この実装では、次のように動作します。
const state = [
{
name: 'BFE',
},
{
name: '.',
}
]
const newState = produce(state, draft => {
draft.push({name: 'dev'})
draft[0].name = 'bigfrontend'
draft[1].name = '.' // 同じ値をsetする
})
console.log(newState);
// [
// { name: 'bigfrontend' },
// { name: '.' },
// { name: 'dev' }
// ]
console.log(newState[0] === state[0]) // false
console.log(newState[1] === state[1]) // true
console.log(newState[2] === state[2]) // false
このように、基本的なオブジェクトと配列の操作ができます。MapやSetに対しても同様に動作しますが、Auto freezingを扱う場合は、cloneをする必要があります。