【javascript】またもやDeepCopyに苦しめられた話
JavascriptTypescriptUncategorized
以前『【javascript】オブジェクトのコピーは沼にハマるから気をつけろ』という記事を書き、もうjavascriptの配列操作は完全に理解したと思っていた矢先、Atcoderでまたもやこいつに苦しめられました。
TL;DR
配列を初期化するときも、以下のように気をつけよう
ダメなパターン
const array = Array(3).fill([false, false]) // ← fill([false, false])の部分がDeepCopyになる
console.log(array)
// [ [ false, false ], [ false, false ], [ false, false ] ]
array[0][1] = true
console.log(array)
// [ [ false, true ], [ false, true ], [ false, true ] ]
2次元配列の一つの要素だけを変更しようとしても、全ての要素が変更されてしまう
正しいパターン
const array = Array.from(new Array(3), () => new Array(2).fill(false))
console.log(array)
// [ [ false, false ], [ false, false ], [ false, false ] ]
array[0][1] = true
console.log(array)
// [ [ false, true ], [ false, false ], [ false, false ] ]
2次元配列を初期化するときはこのように『new Array()』を使ってあげると、DeepCopyにならない
DeepCopyとはなんぞや
DeepCopyとは?という方は、以下の記事に詳しく書いているのでそちらも見ていただけると!
zawa1205
webフロントエンドエンジニア