For instance I have a matrix like this:
|1 2 3|
|4 5 6|
|7 8 9|
and I need it to convert into a matrix like this:
|1 4 7|
|2 5 8|
|3 6 9|
What is the best and optimal way to achieve this goal?
DuckDucking turned up this by Ken. Surprisingly, it's even more concise and complete than Nikita's answer. It retrieves column and row lengths implicitly within the guts of map()
.
function transpose(a) {
return Object.keys(a[0]).map(function(c) {
return a.map(function(r) { return r[c]; });
});
}
console.log(transpose([
[1,2,3],
[4,5,6],
[7,8,9]
]));
See article: Transpose An Array In JavaScript and jQuery
function transpose(a) {
// Calculate the width and height of the Array
var w = a.length || 0;
var h = a[0] instanceof Array ? a[0].length : 0;
// In case it is a zero matrix, no transpose routine needed.
if(h === 0 || w === 0) { return []; }
/**
* @var {Number} i Counter
* @var {Number} j Counter
* @var {Array} t Transposed data is stored in this array.
*/
var i, j, t = [];
// Loop through every item in the outer array (height)
for(i=0; i<h; i++) {
// Insert a new row (array)
t[i] = [];
// Loop through every item per item in outer array (width)
for(j=0; j<w; j++) {
// Save transposed data.
t[i][j] = a[j][i];
}
}
return t;
}
console.log(transpose([[1,2,3],[4,5,6],[7,8,9]]));
Just like in any other language:
int[][] copy = new int[columns][rows];
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j) {
copy[j][i] = original[i][j];
}
}
You just have to construct the 2D array differently in JS. Like this:
function transpose(original) {
var copy = [];
for (var i = 0; i < original.length; ++i) {
for (var j = 0; j < original[i].length; ++j) {
// skip undefined values to preserve sparse array
if (original[i][j] === undefined) continue;
// create row if it doesn't exist yet
if (copy[j] === undefined) copy[j] = [];
// swap the x and y coords for the copy
copy[j][i] = original[i][j];
}
}
return copy;
}
console.log(transpose([
[1,2,3],
[4,5,6],
[7,8,9]
]));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With