ダッシュで奪取

自分用のメモ

【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まんボルトを覚えさせることができました!ヤッター

このやり方だと json で表現できない場合(Dateオブジェクトを持っているとか)にうまくコピーできないようなので、他の方法を試し次第追記します。

参考URL