Ich habe eine Reihe von Arrays, so etwas wie:
[
[1,2,3],
[1,2,3],
[1,2,3],
]
Ich möchte es transponieren, um das folgende Array zu erhalten:
[
[1,1,1],
[2,2,2],
[3,3,3],
]
Es ist nicht schwierig, dies programmgesteuert mit Schleifen zu tun:
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;
}
Dies scheint jedoch sperrig zu sein, und ich denke, es sollte einen einfacheren Weg geben, dies zu tun. Gibt es?
javascript
arrays
matrix
transpose
ckersch
quelle
quelle
arrayLength
Parameter genau verwendet? Um sicherzustellen, dass Sie nicht über eine bestimmte Anzahl von Elementen im Array hinausgehen?Antworten:
quelle
array[0].map
stattarray.map
?array[0].map
weil er so oftarray.map
iterieren möchte, wie es Spalten gibt, würde er iterieren, wie viele Zeilen es gibt.loops
sind 45% langsamer alsmap
. Und ja, es wird korrekt transponiert, sodass der zweite Lauf die anfängliche Matrix zurückgibt.Hier ist meine Implementierung in einem modernen Browser (ohne Abhängigkeit):
quelle
Sie könnten underscore.js verwenden
quelle
rambda
Sie es einfach tun könnenconst transpose = apply(zip)
kürzester Weg mit
lodash
/underscore
undes6
:wo
matrix
könnte sein:quelle
_.zip.apply(_, matrix)
Viele gute Antworten hier! Ich habe sie zu einer Antwort zusammengefasst und einen Teil des Codes für eine modernere Syntax aktualisiert:
Einzeiler inspiriert von Fawad Ghafoor und Óscar Gómez Alcañiz
Funktionaler Ansatzstil mit Reduktion von Andrew Tatomyr
Lodash / Underscore von marcel
Vanille-Ansatz
Vanilla In-Place-ES6-Ansatz, inspiriert von Emanuel Saringan
quelle
Ordentlich und rein:
Frühere Lösungen können zu Fehlern führen, wenn ein leeres Array bereitgestellt wird.
Hier ist es als Funktion:
Aktualisieren. Mit dem Spread-Operator kann es noch besser geschrieben werden:
quelle
Sie können dies direkt vor Ort tun, indem Sie nur einen Durchgang ausführen:
quelle
[arr[j][j],arr[i][j]] = [arr[i][j],arr[j][j]]
aber es scheint nicht zu funktionieren. Vermisse ich etwas?[arr[j][i], arr[i][j]] = [arr[i][j], arr[j][i]]
. Beachten Sie, dass Sie einigearr[j][j]
Begriffe haben, die sich immer auf Zellen in der Diagonale beziehen.Nur eine weitere Variante mit
Array.map
. Durch die Verwendung von Indizes können Matrizen transponiert werden, wobeiM != N
:Zum Transponieren müssen die Elemente nur spaltenweise und dann zeilenweise zugeordnet werden.
quelle
Wenn Sie die Option haben, die Ramda JS- und ES6-Syntax zu verwenden, haben Sie folgende Möglichkeit:
quelle
transpose
-function jetzt.Ein weiterer Ansatz besteht darin, das Array von außen nach innen zu iterieren und die Matrix durch Abbildung innerer Werte zu reduzieren.
quelle
Wenn die Verwendung von RamdaJS eine Option ist, kann dies in einer Zeile erreicht werden:
R.transpose(myArray)
quelle
Sie können dies ohne Schleifen erreichen, indem Sie Folgendes verwenden.
Array
Array.prototype.map
Array.prototype.reduce
Array.prototype.join
String.prototype.split
Es sieht sehr elegant aus und erfordert keine Abhängigkeiten wie jQuery von Underscore.js .
Minimiert
Hier ist eine Demo, die ich zusammengeschmissen habe. Beachten Sie das Fehlen von Schleifen :-)
quelle
ES6 1liner als:
so wie bei Óscar, aber wie möchten Sie es lieber im Uhrzeigersinn drehen:
quelle
Bearbeiten: Diese Antwort würde die Matrix nicht transponieren, sondern drehen. Ich habe die Frage überhaupt nicht sorgfältig gelesen: D.
Drehung im und gegen den Uhrzeigersinn:
quelle
Ich fand die obigen Antworten entweder schwer zu lesen oder zu ausführlich, also schreibe ich selbst eine. Und ich denke, dies ist die intuitivste Methode, um die Transponierung in der linearen Algebra zu implementieren. Sie führen keinen Werteaustausch durch , sondern fügen jedes Element an der richtigen Stelle in die neue Matrix ein:
quelle
Ich denke, das ist etwas besser lesbar. Es verwendet
Array.from
und Logik ist identisch mit der Verwendung von verschachtelten Schleifen:Wenn Sie mit Arrays ungleicher Länge arbeiten, müssen Sie diese durch
arr[0].length
etwas anderes ersetzen :quelle
quelle
Eine bibliotheksfreie Implementierung in TypeScript, die für jede Matrixform funktioniert, die Ihre Arrays nicht abschneidet:
quelle
Einzeiler, der das angegebene Array nicht ändert.
quelle
quelle
quelle
Ich habe keine Antwort gefunden, die mich zufriedenstellte, also habe ich selbst eine geschrieben. Ich denke, es ist leicht zu verstehen und umzusetzen und für alle Situationen geeignet.
quelle
Da bisher niemand einen funktionalen rekursiven Ansatz erwähnt hat, ist dies meine Meinung. Eine Adaption von Haskell
Data.List.transpose
.quelle