2

(同じ長さの)行の配列を列の配列に変換する最も洗練された方法は何でしょうか?

例えば:

[1,2,3]
[4,5,6]

# To    

[1,4]
[2,5]
[3,6]

これは私がこれまでに持っているものです:

grid = [
  [1,2,3]
  [4,5,6]
]

grid2 = []

for i in grid[0]
  grid2.push []

for row, y in grid
  for el, x in row
    grid2[x].push el

それを行う1ライナーさえあるかもしれませんか?

4

4 に答える 4

6

Javascriptでは、ECMAScript 5配列メソッドを使用する環境で作業している場合、map()この関数は次の場合にうまく機能します。

var grid2 = grid[0].map(function(col, i) {
    return grid.map(function(row) {
        return row[i];
    });
});

改行を殺した場合、これはワンライナーになる可能性があります。:)

CoffeeScript:

grid[0].map (col, i) -> grid.map (row) -> row[i]
于 2011-05-11T23:01:30.993 に答える
4

順序が重要な配列ではfor..inを使用しないでください!!

for..inを配列で使用すると、次のような危険があります。

  1. Array.prototypeと配列自体のプロパティを含む、配列の列挙可能なすべてのプロパティが返されるため、そのような拡張が発生していないことを完全に確信するか、hasOwnPropertyと数値インデックスのチェックを行う必要があります。

  2. キーが返される順序は保証されておらず、簡単に混乱する可能性があります-IEは追加された順序でキーを返すため、順序が狂って追加された場合(たとえば、非常に一般的なデクリメントwhileループを使用して)、キーが返されます。逆の順序で

FirefoxとIEで次のことを試してください。

var a = [0,1,2,3];
var b = [];
var i = a.length;
while (i--) {
  b[i] = a[i];
}
var s = [];
for (var p in b) {
  s.push(b[p]);
}

alert(b + '\n' + s);

// Firefox: 0,1,2,3
//          0,1,2,3

// IE: 0,1,2,3
//     3,2,1,0

順序が重要な場合は、必要な順序でキーに明示的にアクセスするループのみを使用してください。これはオブジェクトにも当てはまります。JavaScriptでは、すべてのオブジェクトに対してfor..inを使用してプロパティが返される順序は実装に依存し、ブラウザーによって異なるためです(JavaScriptでは、すべてがオブジェクトであることに注意してください)。

For..inは、上記の問題が重要ではないか、処理されているアレイで使用できます。これは、スパース配列や数値以外の列挙可能なプロパティにアクセスするための便利なツールです。

一般的な転置関数は次のとおりです。

function rows2cols(a) {
  var r = [];
  var t;

  for (var i=0, iLen=a.length; i<iLen; i++) {
    t = a[i];

    for (var j=0, jLen=t.length; j<jLen; j++) {
      if (!r[j]) {
        r[j] = [];
      }
      r[j][i] = t[j];
    }
  }
  return r;
}

短縮して最適化することもできますが、上記は適度にパフォーマンスが高く、保守が容易な機能です。

于 2011-05-11T23:38:36.647 に答える
2

これを試して:

var new_grid = [];
for(var i = 0; i < grid[0].length; i++){
    new_grid.push([grid[0][i], grid[1][i]]); 
    // this is all under assumption that all the arrays are the same size
}

次の結果が得られます:

new_grid = [
   [1,4],
   [2,5],
   [3,6],
]
于 2011-05-11T22:39:37.230 に答える
2

CoffeeScript:

((row[i] for row in grid) for i in [0...grid[0].length])
于 2011-05-11T22:54:59.513 に答える