36 Stimmen

Vertauschen von Zeilen mit Spalten (Transposition) einer Matrix in Javascript

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?

83voto

hobs Punkte 16670

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

1,4,5 , 2,5,8 , 7,8,9

4 Stimmen

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.

0 Stimmen

Gutes Argument. Das war mir nicht aufgefallen. Danke für den Hinweis.

3 Stimmen

Allerdings gibt es eine Lösung für dieses Problem, die hier beschrieben wird... developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/

22voto

troynt Punkte 1870

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

0 Stimmen

Leider fügt dieser Ansatz jedem Array in Ihrer Anwendung ein neues Element hinzu! Schauen Sie hier: jsfiddle.net/gj6q1k0j

0 Stimmen

@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.

0 Stimmen

Vielen Dank für das aktualisierte Beispiel. Mein Punkt war, dass die ursprüngliche Lösung brach alle Arrays...

7voto

Nikita Rybak Punkte 66202

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

0 Stimmen

Im Gegensatz zu den anderen Lösungen funktioniert diese Lösung auch bei gezackten Arrays, d. h. wenn Sie [4,5,6] in [4,5,6,0] ändern, funktioniert diese Lösung trotzdem. Andere funktionieren nicht.

7voto

KIT-Inwi Punkte 86

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

2voto

Anton Iokov Punkte 21

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.com

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.

Powered by:

X