JavaScriptで2次元配列の転置を行う
I've got a array of arrays, like:
[
[1,2,3],
[1,2,3],
[1,2,3],
]
これを転置して、以下のような配列を得たい。
[
[1,1,1],
[2,2,2],
[3,3,3],
]
ループを使ってプログラム的に行うことは難しくありません。
function transposeArray(array, arrayLength){
var newArray = [];
for(var i = 0; i < array.length; i++){
newArray.push([]);
};
for(var i = 0; i < array.length; i++){
for(var j = 0; j < arrayLength; j++){
newArray[j].push(array[i][j]);
};
};
return newArray;
}
しかし、これはかさばるので、もっと簡単な方法があるような気がしています。あるのでしょうか?
134
20
要素の値、要素のインデックス、走査されるArrayオブジェクトの3つの引数で呼び出されます。
underscore.js]1を使えばいいんです。
これが最新のブラウザでの実装です(依存関係なし)。
lodash
/underscore
とes6
の最短の方法:ここで、「マトリックス」は次のようになります。
ここに多くの良い答えがあります。! それらを1つの回答に統合し、より最新の構文のためにコードのいくつかを更新しました。
Fawad GhafoorおよびÓ scar Gó mez Alcañ izに触発されたワンライナー。
Andrew Tatomyrによる縮小機能アプローチスタイル。
[marcel]によるLodash / Underscore(https://stackoverflow.com/users/4796214/marcel)。
バニラアプローチ。
Emanuel Saringanに触発されたバニラのインプレースES6アプローチ。
きちんとした純粋な:
空の配列が提供されている場合、以前のソリューションは失敗につながる可能性があります。
ここに関数としてあります:
更新。。 スプレッド演算子を使用すると、さらにうまく記述できます。
1つのパスのみを実行することで、インプレースでそれを行うことができます。
Array.ma p
を使用した別のバリエーション。 インデックスを使用すると、行列をMで転置できます。 != N
:転置に必要なのは、要素を列ごとにマッピングし、次に行ごとにマッピングすることだけです。
Ramda JSおよびES6構文を使用するオプションがある場合は、それを行う別の方法を次に示します。
。
。
アレイを外側から内側に反復して別のアプローチを行い、内部値をマッピングしてマトリックスを減らします。
。 。 const。 transpose = array => array.re duce((r、a)=> a.ma p((v、i)=> [。..(r [i] || [])、v])、[])、。 行列= [[1、2、3]、[1、2、3]、[1、2、3]];。
。
RamdaJSの使用がオプションである場合、これは1行で達成できます:
R.tr anspose(myArray)
。編集:この答えはマトリックスを転置するのではなく、回転させます。 そもそも質問を注意深く読んでいませんでした:D 。
時計回りおよび反時計回りの回転:
ループなしでこれを達成するには、以下を使用します。
配列
。Array.prototype.ma p
。Array.prototype.re duce
。Array.prototype.jo in
。String.prototype.sp lit
。それは非常にエレガントに見え、Underscore.jsのjQueryなどの依存関係を必要としません。
最小化。
---。
これは私が一緒に投げたデモです。 ループの不足に注意してください:-)。
。
。
ES6 1ライナー:
Ó scar'sと同じですが、時計回りに回転させます。
上記の答えは読みにくいか、冗長すぎるため、自分で書きます。 これは線形代数で転置を実装する最も直感的な方法だと思います。値交換を実行するのではなく、各要素を新しい行列の適切な場所に挿入するだけです。
これはもう少し読みやすいと思います。
Array.fr om
を使用し、ロジックはネストされたループの使用と同じです。。
。
長さが不等な配列を扱っている場合は、「arr [0]。length」を別のものに置き換える必要があります。
。
。
配列を切り捨てないマトリックス形状で動作するTypeScriptのライブラリフリーの実装:
指定された配列を変更しないワンライナー。