Я получил эту матрицу, которая в зависимости от результатов, которые я получаю от сервера, может меняться по ширине. В принципе, это может быть что-то вроде
[undefined, undefined]
[1, 2, 3, 4]
[1, 2]
[undefined, undefined, undefined]
[1, 2, 3, 4, 5, 6]
и я хочу, чтобы это было так
[undefined, 1, 1, undefined, 1]
[undefined, 2, 2, undefined, 2]
[undefined, 3,undefined, undefined, 3]
[undefined, 4, undefined, undefined, 4]
[undefined, undefined, undefined, undefined, 5]
[undefined, undefined, undefined, undefined, 6]
Обратите внимание, что высота изменилась на максимальную ширину первого примера. Я погуглил, и лучшее решение, которое я получил, было это
array.map((row, i) => array.map(col => col[i]))
но это решение не изменит мою высоту матрицы. Я попробовал 2 цикла, но, думаю, я неправильно его закодировал, так как не получил ожидаемого результата. Если бы кто-нибудь мог мне немного помочь, это было бы здорово
Здесь есть несколько шагов.
Найдите максимальную длину.
Нормализовать
А затем поверните
Я разместил комментарии в коде, чтобы показать каждую часть.
const input = [
[undefined, undefined],
[1, 2, 3, 4],
[1, 2],
[undefined, undefined, undefined],
[1, 2, 3, 4, 5, 6]
];
//first find max length
const maxw = Math.max(...input.map(m => m.length));
//now normalize
const norm_inputs = input.map(m =>
(new Array(maxw)).concat(m).slice(-maxw)
);
//now rotate..
const output = (new Array(maxw).fill(0)).map(
(row, i) => norm_inputs.map(col => col[i]))
@tiagomnf Я поставил -6 для среза вместо -maxw, попробуйте сейчас.
Есть много способов решить эту проблему (как показывают другие ответы). Вот как я бы это сделал, так как это сводит к минимуму количество итераций по данным.
const data = [
[undefined, undefined],
[1, 2, 3, 4],
[1, 2],
[undefined, undefined, undefined],
[1, 2, 3, 4, 5, 6],
];
// get the length of the longest array
const maxLen = data.reduce((max, {length}) => Math.max(max, length), 0);
// make a new set of arrays
const result = Array.from({ length: maxLen }, (_, i) => data.map(col => col[i]));
console.info(result);
Думаю, было бы понятнее, если бы вы назвали итерированный элемент картаряд вместо столбdata.map(row => row[i])
Предполагая, что ваша матрица хранится в matrix
,
const transformed = [];
const maxWidth = matrix.reduce((max, current) => {
return (current.length > max) ? current.length : max;
}, 0);
// Loop over each column
for (let i = 0; i < maxWidth; i++) {
const tRow = [];
// Loop over each row of the current column
for (const row of matrix) {
tRow.push(row[i]);
}
transformed.push(tRow);
}
Ваше решение почти сработало, но даже несмотря на то, что матрица имела ожидаемую высоту, она все равно получила только количество элементов высоты входной матрицы.