順序が重要な配列ではfor..inを使用しないでください!!
for..inを配列で使用すると、次のような危険があります。
Array.prototypeと配列自体のプロパティを含む、配列の列挙可能なすべてのプロパティが返されるため、そのような拡張が発生していないことを完全に確信するか、hasOwnPropertyと数値インデックスのチェックを行う必要があります。
キーが返される順序は保証されておらず、簡単に混乱する可能性があります-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;
}
短縮して最適化することもできますが、上記は適度にパフォーマンスが高く、保守が容易な機能です。