Что такое массив из массивов?
Если смотреть на задачу со стороны визуализации, то массив из массивов представляет собой таблицу со столбцами и записями.
Поэтому когда мы хотим перевернуть массив из массивов на девяносто градусов, то фактически мы хотим наклонить таблицу в правую или левую сторону — повернуть по часовой стрелке или против часовой.
Как это сделать?
Функция переворота массива из массивов на 90 градусов по часовой стрелке — в право
function rotate_arr_by_90_deg_r(arr){
let n_arr= []; // новый перевёрнутый массив
let n_rows = arr[0].length; // количество новых строк
let n_cols = arr.length; // количество новых столбцов
for(let x = 0; x < n_rows; x++){
let row_arr = []; // это элемент из нового массива
for(let y = (n_cols — 1), z = 0; y >= 0; y—, z++){
row_arr[z] = arr[y][x];
}
n_arr[x] = row_arr;
};
return n_arr;
};
Как работает функция поворота массива из массивов на право на 90 градусов?
Функция ожидает получить массив из массивов. Причём важен тот факт, что внутренние массивы должны иметь одинаковую длину. Это обязательное условие. Иначе всё развалится.
Представим, что нам нужно повернуть массив вида:
let arr = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] ];
Давайте запустим нашу функцию переворота и передадим в неё этот массив:
rotate_arr_by_90_deg_r(arr)
Изначальная таблица у нас имела 3 записи и 4 столбца. Когда мы перевернули массив, то у нас записей стало 4, а столбцов 3.
Мы используем два цикла for так как фактически наша таблица имеет двумерное пространство. То есть нам нужно двигаться как по горизонтали, так и по вертикали.
В теле функции мы объявляем три переменные:
- n_arr (итоговый массив, который мы хотим получить — новый перевёрнутый массив)
- n_rows (количество новых записей)
- n_cols (количество новых столбцов)
Первый цикл мы ограничиваем количеством новых записей. В нашем случае он будет иметь 4 прогона — 0, 1, 2, 3. Нам нужны индексы для складывания. По сути первый цикл определяет количество элементов в новом массиве.
В теле первого цикла мы объявляем переменную row_arr, которая будет накапливать значения и она же будет являться элементом нового массива.
Второй цикл работает со своими двумя переменными — y и z.
Переменная y движется по убыванию до нуля, от количества элементов в оригинальном массиве.
Переменная z движется по возрастанию от нуля, до количества вложенных чисел у элементов в оригинальном массиве.
Зачем нужно переворачивать массивы из массивов на 90 градусов?
Однажды любой разработчик доходит до темы машинного обучения. Рутинная работа с большими данными начинает надоедать и хочется всё чаще и чаще автоматизировать некоторые процессы.
Массивы из массивов это не только таблицы, но это ещё и матрицы с векторами. Это уже касается вопросов мира математики.
Так вот данные не всегда приходят в нужном формате и порой приходится их вертеть в разные стороны, чтобы получать нужные результаты или вычисления при работе с машинным обучением.
Информационные ссылки
Стандарт ECMAScript в одну страницу — https://tc39.es/ecma262/
Стандарт ECMAScript в несколько страниц — https://tc39.es/ecma262/multipage/