Ich habe zum Beispiel eine Matrix wie diese:
|1 2 3|
|4 5 6|
|7 8 9|
und ich muss sie in eine Matrix wie diese umwandeln:
|1 4 7|
|2 5 8|
|3 6 9|
Was ist der beste und optimale Weg, um dieses Ziel zu erreichen?
Ich habe zum Beispiel eine Matrix wie diese:
|1 2 3|
|4 5 6|
|7 8 9|
und ich muss sie in eine Matrix wie diese umwandeln:
|1 4 7|
|2 5 8|
|3 6 9|
Was ist der beste und optimale Weg, um dieses Ziel zu erreichen?
DuckDucking aufgetaucht este von Ken . Überraschenderweise ist er sogar noch knapper und vollständiger als Nikita 's Antwort . Es ruft die Spalten- und Zeilenlängen implizit in den Eingeweiden von 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]
]));
Object.keys wird von IEX<9 nicht unterstützt, also würde ich in diesem Fall bei einer der anderen Antworten bleiben, wenn Sie dafür Unterstützung benötigen.
Allerdings gibt es eine Lösung für dieses Problem, die hier beschrieben wird... developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/
Siehe Artikel: Transponieren eines Arrays in JavaScript und 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]]));
Leider fügt dieser Ansatz jedem Array in Ihrer Anwendung ein neues Element hinzu! Schauen Sie hier: jsfiddle.net/gj6q1k0j
@vektor Ihre Eingabe sollte wie [[1,2,3,4]] aussehen Außerdem sollten Sie eine Schleife wie for (var key in p) { if (p.hasOwnProperty(key)) {
Wenn Sie planen, für..in Aber ja, es ist wahrscheinlich eine schlechte Idee, Array zu erweitern. Ich werde das Beispiel ändern.
Genau wie in jeder anderen Sprache:
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];
}
}
Sie müssen das 2D-Array in JS nur anders konstruieren. Zum Beispiel so:
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]
]));
Ich habe nicht genug Ansehen, um zu kommentieren (wtf.), also muss ich posten Ken's aktualisierte Version als separate Antwort:
function transpose(a) {
return a[0].map(function (_, c) { return a.map(function (r) { return r[c]; }); });
}
Kompakte Version von Antwort von Hobs unter Verwendung von Pfeilfunktionen aus ES6:
function transpose(matrix) {
return Object.keys(matrix[0])
.map(colNumber => matrix.map(rowNumber => rowNumber[colNumber]));
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.