長さが異なり、未定義の値を無視しているため、あなたが求めているのは少し奇妙に見えますが、それでも達成可能です。
Arrayfor..in
にループを使用しないでください。通常の. また、元の子Arraysの長さの最大値である、新しい親Arrayに含まれるアイテムの数を知る必要があります。for
var arrR = [ // will refer to "down" and "across" as in this literal
[1],
[1, 2],
[1, 2, 3],
[4, 2, 3],
[4, 5, 3],
[4, 5, 6]
];
function r2c(arr) {
var arrC = [], // next get the longest sub-array length
x = Math.max.apply(Math, arr.map(function (e) {return e.length;})),
y = arr.length,
i, j;
for (i = 0; i < x; ++i) { // this is the loop "down"
arrC[i] = [];
for (j = 0; j < y; ++j) // and this is the loop "across"
if (i in arr[j])
arrC[i].push(arr[j][i]);
}
return arrC;
}
var arrC = r2c(arrR);
/* [
[1, 1, 1, 4, 4, 4],
[2, 2, 2, 5, 5],
[3, 3, 3, 6]
] */
[[1], [1, 2], [1]]
になることに満足しているかどうかを検討する必要がありますが[[1, 1, 1], [2]]
、これは予想外 ( の位置2
が完全に失われている) と考えられますが、意図したとおりのようです。