【JavaScript】ディープコピーしたい
つまづいたのでメモです。
失敗
ピカチュウをコピーして、コピーしたピカチュウに10まんボルトを覚えさせてみます。
const pikachu = { name: 'ピカチュウ', type: 'でんき', skills: [ 'でんきショック', 'しっぽをふる', 'でんじは', 'でんこうせっか' ] } // オリジナル console.log('オリジナルのピカチュウ >>>>') console.log(pikachu.name) console.log(pikachu.skills + '\n') // オリジナルと同じ、コピーを作る let copyPikachu = pikachu // コピーに10まんボルトを覚えさせる copyPikachu.skills[0] = '10まんボルト' // コピー console.log('コピーのピカチュウ >>>>') console.log(copyPikachu.name) console.log(copyPikachu.skills + '\n') // オリジナル console.log('オリジナルのピカチュウ >>>>') console.log(pikachu.name) console.log(pikachu.skills + '\n')
結果
オリジナルのピカチュウ >>>> ピカチュウ でんきショック,しっぽをふる,でんじは,でんこうせっか コピーのピカチュウ >>>> ピカチュウ 10まんボルト,しっぽをふる,でんじは,でんこうせっか オリジナルのピカチュウ >>>> ピカチュウ 10まんボルト,しっぽをふる,でんじは,でんこうせっか
コピーしたピカチュウだけに10まんボルトを覚えさせたつもりだったのですが、コピー元であるオリジナルのピカチュウも覚えてしまいました。
できた
変わったのは、 18行目の部分だけです。
一回 json データにする → json データをオブジェクトの形に戻すことでコピーを作っています。
const pikachu = { name: 'ピカチュウ', type: 'でんき', skills: [ 'でんきショック', 'しっぽをふる', 'でんじは', 'でんこうせっか' ] } // オリジナル console.log('オリジナルのピカチュウ >>>>') console.log(pikachu.name) console.log(pikachu.skills + '\n') // オリジナルと同じ、コピーを作る let copyPikachu = JSON.parse(JSON.stringify(pikachu)) // コピーに10まんボルトを覚えさせる copyPikachu.skills[0] = '10まんボルト' // コピー console.log('コピーのピカチュウ >>>>') console.log(copyPikachu.name) console.log(copyPikachu.skills + '\n') // オリジナル console.log('オリジナルのピカチュウ >>>>') console.log(pikachu.name) console.log(pikachu.skills + '\n')
結果
オリジナルのピカチュウ >>>> ピカチュウ でんきショック,しっぽをふる,でんじは,でんこうせっか コピーのピカチュウ >>>> ピカチュウ 10まんボルト,しっぽをふる,でんじは,でんこうせっか オリジナルのピカチュウ >>>> ピカチュウ でんきショック,しっぽをふる,でんじは,でんこうせっか
コピーのピカチュウにのみ10まんボルトを覚えさせることができました!ヤッター