Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

同じ値で満たされた多次元配列を作る

同じ値で満たされた多次元配列を作る方法です。
落ち物ゲーを作るときのパターンだとか、シミュレーションゲーのマップパターンだとかで使えます。

実際のところ

サンプルケースとして、-1で満たされた9 x 16の二次元配列を作るケースを考えます。

生JSの力技

追記:後述するように、これは生成後の使い勝手が悪いっぽいです

forでぶん回す方法をよく見かけます。
個人的には地獄ネストになって好きじゃないので、Array#fillを使った方法でやります。

a = Array(9).fill(Array(16).fill(-1))

/*
[ [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
  [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ] ]
*/

mathjsをつかう

nodejsが使える環境なら、数式まわりを拡張するmathjsを使う手があります。
導入はnpmでらくらく。

$ npm install mathjs

最初にrequireする必要がある代わりに、その後の取り扱いが前述のArray方式より楽です。

math = require('mathjs')
a = math.matrix().resize([9,16],-1)

/*
Matrix {
  _data: 
   [ [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ],
     [ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ] ],
  _size: [ 9, 16 ],
  _datatype: undefined }
*/

追記

Array#fillの多重化方式だと特定セルだけの更新ができないみたいです。
素直にmathjsを使ったほうがよさ気。
shuzo-kino.hateblo.jp