Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

0で埋まった二次配列の作り方

0で埋まった二次配列、つまり零行列の作り方に関して。

真っ先に思いつきそうなコード

const arr = Array(n).fill(Array(m).fill(0));

これで出来たら嬉しいんですがね…実はfillに配列を渡すと同じ配列で埋めてしまいます。

つまり、arr[0] === arr[1] === arr[2] === … なので、arr[0][1]=42とするとarr[1][1]もarr[2][1]も42となります。これでは困ります。

解決できそうな方法

const arr = Array(n).map(() => Array(m).fill(0));

アロー関数内で毎回配列を作るので全ての行が異なる配列となります。

…正確にはなりません。やるとわかりますが、mapが適用されません。詳しくは以下の記事を読んでください。

www.pandanoir.info

一応解決できるコード

const arr = Array(n).fill(0).map(() => Array(m).fill(0));

fillでまず埋めることでmapができるようになります。埋める値は0でなくてもいいです。どうせmapで上書きするので。

…ですが初見の人にはfillの意図が分かりませんよね。

意図が伝わりそうなコード

というわけでこれが最終版です。

const arr = Array.apply(null, Array(n)).map(() => Array(m).fill(0));

まあ上と50歩100歩のような気もしますが。

ちなみに

イミュータブル使えば実は初めのコードで十分です。

const arr = Array(n).map(() => ImmutableArray(m).fill(0));

やっぱイミュータブル強いですね。実に直感的なコードです。

追記: がおさんに教えてもらったコード

const arr = [...Array(n)].map(() => Array(m).fill(0));

スプレッド演算子を使えばこんな書き方もできます。すごいですね...