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が適用されません。詳しくは以下の記事を読んでください。
一応解決できるコード
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));
やっぱイミュータブル強いですね。実に直感的なコードです。
追記: がおさんに教えてもらったコード
10*10だとアレなので、n*mで表現すると
— がお@1日目東ポ03-a (@gaogao_9) 2016年6月4日
[...Array(n)].map(_=> Array(m).fill(0))
やね。
const arr = [...Array(n)].map(() => Array(m).fill(0));
スプレッド演算子を使えばこんな書き方もできます。すごいですね...