【広告 No.01】

2015年4月16日木曜日

【Javascript】二次元配列のマトリクス(行列変換)

【実現したいこと】

単純に二次元配列の行と列の値を交換する関数を作成したい(行列変換)

ロジックとしては単純なんですよね。変換元の配列a[]を二重ループして、インデックス値を逆にした配列b[]を生成すればよいのです。しかしながら、仕様上、そう単純にはいかないんですね。




最初は以下の例のように記述していました。

function hoge(a){
   var i,j,l0 = a.length,l1;
   var b = [];
   for (i = 0; i < l0; i++) {
      for (j = 0,l1 = a[i].length; j < l1; j++) {
         b[j][i] = a[i][j];
      }
   }
   return b;
}

TypeError: Cannot set property '0' of undefined

何が問題か。。。
ハイライトさせている子ループの処理部分、行列変換の肝部分です。配列bの二次元目の第1引数、0番目の要素が未定義なので、値を設定できず、「TypeError: Cannot set property '0' of undefined」と怒られちゃうんですね。

自動で生成されることを期待していましたが、JavascriptにおけるArrayの振る舞いはそういう仕様ではないんです。

ということで正解例です。もちろん、もっとスマートな方法もあるかと思いますけど。

function hoge(ary){
  var i,j,l0,l1,ary2 = [];
  for (i = 0,l0 = ary.length; i < l0; i++) {
    for (j = 0,l1 = ary[i].length; j < l1; j++) {
      (i > 0)? ary2[j].push(ary[i][j]) :ary2[j] = [ary[i][j]];
    }
  }
  return ary2;
}
var a = [['あ',1,'A'],['い',2,'B'],['う',3,'C']];
var b = hoge(a);   //[['あ','い','う'],[1,2,3],['A','B','C']]

以上、「二次元配列のマトリクス(行列変換)」のロジック例でした。

[追記]
サンプルスクリプトを修正しました。(2015/5/2)