zawatech

【javascript】またもやDeepCopyに苦しめられた話

カテゴリ
JavascriptTypescriptUncategorized
Xこの記事をポストする
この記事をLINEでシェア

以前『【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とは?という方は、以下の記事に詳しく書いているのでそちらも見ていただけると!

https://zawatech.com/?p=326

Xこの記事をポストする
この記事をLINEでシェア
zawa1205

zawa1205

Qiita
GitHub
mail

webフロントエンドエンジニア