Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

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

実際のところ

サンプルケースとして、-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