二次元配列を転置(transpose)するJavaScriptワンライナーをネットで見つけて使えることはすぐにわかったのですが、どのように動作するのかがすぐにわからなかったので解説を書いてみました。
参考
日本語記事
https://qiita.com/kznr_luk/items/790f1b154d1b6d4de398
↑の元ネタ
https://stackoverflow.com/questions/17428587/transposing-a-2d-array-in-javascript
ワンライナー
array[0].map((col, i) => array.map(row => row[i]));
解説
2つの部分に分けて考えるとわかりやすいです。
まず、置換前の各列をループします。これが転置後二次元配列の各行になります。それが、
array[0].map((col, i) => ...));
の部分になります。
インデックス0
の行を取り出してmapすることで各列のインデックス(変数i
に入る)を使えるようにしています。forループを使うより短く書けますね。
それから、...
の部分が実際に置換後の各行を作っているところです。それが、
array.map(row => row[i])
の部分です。
置換前の二次元配列の列を一次元配列にして返します。
たとえば、i
が0
の場合、array.map(row => row[0])
となり、これはもとの二次元配列の1列目を返します。
これをすべての列に対して行いくっつければ転置した二次元配列の完成です。
まとめると、
array[0].map((col, i) => // 二次元配列の各列をループして、
array.map(row => row[i]) // 各列を取り出して一次元配列にして、
); // くっつける。
となります。