Транспонировать нерегулярную матрицу в JavaScript

Я получил эту матрицу, которая в зависимости от результатов, которые я получаю от сервера, может меняться по ширине. В принципе, это может быть что-то вроде

[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 цикла, но, думаю, я неправильно его закодировал, так как не получил ожидаемого результата. Если бы кто-нибудь мог мне немного помочь, это было бы здорово

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
443
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Здесь есть несколько шагов.

  1. Найдите максимальную длину.

  2. Нормализовать

  3. А затем поверните

Я разместил комментарии в коде, чтобы показать каждую часть.

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 17.12.2018 17:47

@tiagomnf Я поставил -6 для среза вместо -maxw, попробуйте сейчас.

Keith 17.12.2018 17:52
Ответ принят как подходящий

Есть много способов решить эту проблему (как показывают другие ответы). Вот как я бы это сделал, так как это сводит к минимуму количество итераций по данным.

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])

4javier 06.08.2020 12:35

Предполагая, что ваша матрица хранится в 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);
}

Другие вопросы по теме