J'ai un tableau de tableaux, quelque chose comme:
[
[1,2,3],
[1,2,3],
[1,2,3],
]
Je voudrais le transposer pour obtenir le tableau suivant:
[
[1,1,1],
[2,2,2],
[3,3,3],
]
Il n'est pas difficile de le faire par programmation en utilisant des boucles:
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;
}
Ceci, cependant, semble encombrant, et j'estime qu'il devrait y avoir un moyen plus simple de le faire. Y a-t-il?
javascript
arrays
matrix
transpose
Ckersch
la source
la source
arrayLength
sert exactement le paramètre? Pour vous assurer de ne pas dépasser un certain nombre d'éléments dans le tableau?Réponses:
la source
array[0].map
au lieu dearray.map
?array[0].map
parce qu'il veut itérer autant de fois qu'il y a des colonnes,array.map
il itérerait combien de lignes il y a.loops
sont 45% plus lents quemap
. Et oui, il se transpose correctement, donc la deuxième exécution renvoie la matrice initiale.voici mon implémentation dans un navigateur moderne (sans dépendance):
la source
Vous pouvez utiliser underscore.js
la source
rambda
vous pouvez le faireconst transpose = apply(zip)
chemin le plus court avec
lodash
/underscore
etes6
:où
matrix
pourrait être:la source
_.zip.apply(_, matrix)
Beaucoup de bonnes réponses ici! Je les ai regroupés en une seule réponse et mis à jour une partie du code pour une syntaxe plus moderne:
One-liners inspirés par Fawad Ghafoor et Óscar Gómez Alcañiz
Style d'approche fonctionnelle avec réduire par Andrew Tatomyr
Lodash / Underscore par marcel
Approche vanille
Approche ES6 en place vanille inspirée d' Emanuel Saringan
la source
Propre et pur:
Les solutions précédentes peuvent entraîner un échec dans le cas où un tableau vide est fourni.
Le voici en fonction:
Mettre à jour. Il peut être écrit encore mieux avec l'opérateur de propagation:
la source
Vous pouvez le faire sur place en ne faisant qu'un seul passage:
la source
[arr[j][j],arr[i][j]] = [arr[i][j],arr[j][j]]
mais cela ne semble pas fonctionner, est-ce que je manque quelque chose?[arr[j][i], arr[i][j]] = [arr[i][j], arr[j][i]]
. Notez que vous avez desarr[j][j]
termes qui feront toujours référence à des cellules en diagonale.Juste une autre variante utilisant
Array.map
. L'utilisation d'index permet de transposer des matrices oùM != N
:Tout ce qu'il y a à transposer est de mapper les éléments d'abord par colonne, puis par ligne.
la source
Si vous avez la possibilité d'utiliser la syntaxe Ramda JS et ES6, voici une autre façon de le faire:
la source
transpose
fonction maintenant.Une autre approche en itérant le tableau de l'extérieur vers l'intérieur et en réduisant la matrice en mappant les valeurs internes.
la source
Si l'utilisation de RamdaJS est une option, cela peut être réalisé en une seule ligne:
R.transpose(myArray)
la source
Vous pouvez y parvenir sans boucles en utilisant ce qui suit.
Array
Array.prototype.map
Array.prototype.reduce
Array.prototype.join
String.prototype.split
Il a l'air très élégant et ne nécessite aucune dépendance telle que jQuery de Underscore.js .
Minifié
Voici une démo que j'ai lancée ensemble. Remarquez le manque de boucles :-)
la source
ES6 1liners comme:
comme celui d'Óscar, mais comme vous préférez le faire tourner dans le sens des aiguilles d'une montre:
la source
Edit: Cette réponse ne transposerait pas la matrice, mais la ferait pivoter. Je n'ai pas lu la question attentivement en premier lieu: D
rotation horaire et antihoraire:
la source
J'ai trouvé les réponses ci-dessus difficiles à lire ou trop verbeuses, alors j'en écris une moi-même. Et je pense que c'est le moyen le plus intuitif d'implémenter la transposition en algèbre linéaire, vous ne faites pas d' échange de valeur , mais insérez simplement chaque élément au bon endroit dans la nouvelle matrice:
la source
Je pense que c'est un peu plus lisible. Il utilise
Array.from
et la logique est identique à l'utilisation de boucles imbriquées:Si vous avez affaire à des tableaux de longueur inégale, vous devez les remplacer
arr[0].length
par autre chose:la source
la source
la source
Une implémentation sans bibliothèque dans TypeScript qui fonctionne pour toute forme de matrice qui ne tronquera pas vos tableaux:
la source
Une seule ligne qui ne change pas la matrice donnée.
la source
la source
Je n'ai pas trouvé de réponse qui me satisfasse, alors j'en ai rédigé une moi-même, je pense qu'elle est facile à comprendre et à mettre en œuvre et adaptée à toutes les situations.
la source
Puisque personne n'a jusqu'à présent mentionné une approche fonctionnelle récursive, voici mon avis. Une adaptation de Haskell
Data.List.transpose
.la source