У меня есть массив массивов, что-то вроде:
[
[1,2,3],
[1,2,3],
[1,2,3],
]
Я хотел бы переместить его, чтобы получить следующий массив:
[
[1,1,1],
[2,2,2],
[3,3,3],
]
Это не сложно программно сделать так, используя циклы:
function transposeArray(array, arrayLength){
var newArray = [];
for(var i = 0; i < array.length; i++){
newArray.push([]);
};
for(var i = 0; i < array.length; i++){
for(var j = 0; j < arrayLength; j++){
newArray[j].push(array[i][j]);
};
};
return newArray;
}
Это, однако, кажется громоздким, и я чувствую, что должен быть более простой способ сделать это. Здесь?
javascript
arrays
matrix
transpose
ckersch
источник
источник
arrayLength
конкретно используется параметр? Чтобы вы не выходили за пределы определенного количества элементов в массиве?Ответы:
источник
array[0].map
вместоarray.map
?array[0].map
потому что он хочет повторять, сколько бы раз ни было столбцов,array.map
будет повторять, сколько строк.loops
на 45% медленнее, чемmap
. И да, он транспонируется правильно, поэтому второй прогон возвращает исходную матрицу.Вот моя реализация в современном браузере (без зависимости):
источник
Вы можете использовать underscore.js
источник
rambda
вы можете просто сделатьconst transpose = apply(zip)
кратчайший путь с
lodash
/underscore
иes6
:где
matrix
может быть:источник
_.zip.apply(_, matrix)
Здесь много хороших ответов! Я объединил их в один ответ и обновил часть кода для более современного синтаксиса:
Однострочники, вдохновленные Фавадом Гафуром и Оскаром Гомесом Альканьисом
Стиль функционального подхода с редуктором. Андрей Татомир
Lodash / Подчеркивание от Marcel
Ванильный подход
Ванильный подход ES6, вдохновленный Эмануэлем Саринганом
источник
Аккуратный и чистый:
Предыдущие решения могут привести к сбою в случае предоставления пустого массива.
Вот это как функция:
Обновить. Это может быть написано еще лучше с оператором распространения:
источник
Вы можете сделать это на месте, сделав только один проход:
источник
[arr[j][j],arr[i][j]] = [arr[i][j],arr[j][j]]
но это не сработало, я что-то упустил?[arr[j][i], arr[i][j]] = [arr[i][j], arr[j][i]]
. Обратите внимание, что у вас есть некоторыеarr[j][j]
термины, которые всегда относятся к ячейкам по диагонали.Просто еще один вариант использования
Array.map
. Использование индексов позволяет транспонировать матрицы, гдеM != N
:Все, что нужно для транспонирования - это сопоставление элементов сначала по столбцам, а затем по строкам.
источник
Если у вас есть возможность использовать синтаксис Ramda JS и ES6, то есть еще один способ сделать это:
источник
transpose
-функции в настоящее время.Другой подход - перебирать массив снаружи внутрь и уменьшать матрицу, отображая внутренние значения.
источник
Если использование RamdaJS является опцией, это может быть достигнуто в одной строке:
R.transpose(myArray)
источник
Вы можете достичь этого без петель, используя следующее.
Array
Array.prototype.map
Array.prototype.reduce
Array.prototype.join
String.prototype.split
Это выглядит очень элегантно и не требует никаких зависимостей, таких как jQuery из Underscore.js .
Минимизированный
Вот демо, которое я бросил вместе. Обратите внимание на отсутствие петель :-)
источник
ES6 1 лайнеры как:
так же, как и у Оскара, но лучше повернуть его по часовой стрелке:
источник
Изменить: этот ответ не будет транспонировать матрицу, но повернуть ее. Я не внимательно прочитал вопрос: D
вращение по часовой стрелке и против часовой стрелки:
источник
Мне показалось, что приведенные выше ответы либо трудно читаются, либо слишком многословны, поэтому я пишу один сам. И я думаю, что это наиболее интуитивный способ реализации транспонирования в линейной алгебре, вы не делаете обмен значениями , а просто вставляете каждый элемент в нужное место в новой матрице:
источник
Я думаю, что это немного более читабельно. Он использует
Array.from
и логика идентична использованию вложенных циклов:Если вы имеете дело с массивами неравной длины, вам нужно заменить
arr[0].length
что-то еще:источник
источник
источник
Безбиблиотечная реализация в TypeScript, которая работает для любой формы матрицы, которая не усекает ваши массивы:
источник
Однострочник, который не меняет заданный массив.
источник
источник
Я не нашел ответ, который меня удовлетворил, поэтому я написал его сам, думаю, его легко понять, реализовать и он подходит для всех ситуаций.
источник
Поскольку никто до сих пор не упомянул функционально-рекурсивный подход, вот мое мнение. Адаптация Хаскелла
Data.List.transpose
.источник