La transposition d'une 2D-tableau en JavaScript
J'ai un tableau de tableaux, quelque chose comme:
[
[1,2,3],
[1,2,3],
[1,2,3],
]
Je tiens à 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 à l'aide de 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 je me sens comme il devrait y avoir un moyen plus facile de le faire. Qui est là?
- Pouvez-vous garantir que les deux dimensions sera toujours la même? 1x1, 2x2, 3x3, etc. Qu'est-ce que le
arrayLength
paramètre utilisé pour exactement? Pour vous assurer de ne pas aller au-delà d'un certain nombre d'éléments dans le tableau? - Cela n'a rien à faire avec JQuery, j'ai changé le titre.
- Check this out: stackoverflow.com/questions/4492678/.... Ce que vous faites, c'est de transposer une matrice
- Oui, la transposition. L'inversion serait complètement différente et je ne suis pas intéressé par elle. Pour l'instant.
- Le haut à gauche à en bas à droite de la diagonale est inchangé, il y a donc une optimisation de l'occasion.
Vous devez vous connecter pour publier un commentaire.
array[0].map
au lieu dearray.map
?array[0].map
parce qu'il veut pour itérer toutefois autant de fois qu'il y a de colonnes,array.map
itérer combien de lignes y sont.Vous pouvez utiliser underscore.js
rambda
il vous suffit de faireconst transpose = apply(zip)
voici ma mise en œuvre dans le navigateur moderne (sans dépendance):
plus court chemin avec
lodash
/underscore
etes6
:où
matrix
pourrait être:_.zip.apply(_, matrix)
Beaucoup de bonnes réponses ici! Je consolidées en une seule réponse et mise à jour du code pour un plus moderne de la syntaxe:
One-liners inspiré par Fawad Ghafoor et Oscar Gómez Alcañiz
Approche fonctionnelle de style avec les réduire par Andrew Tatomyr
Lodash/trait de Soulignement par marcel
Vanille approche
De vanille en place ES6 approche inspirée par Emanuel Saringan
Vous pouvez le faire sur place en faisant un seul pass:
Propre et pure:
Solutions précédentes peuvent conduire à l'échec dans le cas d'un tableau vide est fourni.
Ici c'est comme une fonction:
Mise à jour.
Il peut être écrit encore mieux avec la propagation de l'opérateur:
Juste une autre variation à l'aide de
Array.map
. L'utilisation d'index permet de transposer des matrices oùM != N
:Il y a tout de transposer, le mappage des éléments de la colonne d'abord, et ensuite par ligne.
Si vous avez l'option d'utiliser Ramda JS et ES6 syntaxe, alors voici une autre façon de faire:
JS:
HTML:
transpose
-fonction maintenant.Si vous utilisez RamdaJS est une option, cela peut être réalisé en une seule ligne:
R.transpose(myArray)
Edit: Cette réponse ne serait pas transposer la matrice, mais la faire tourner. Je n'ai pas de lire attentivement la question à la première place 😀
des aiguilles d'une montre et dans le sens inverse de rotation:
Une autre approche par l'itération sur le tableau à partir de l'extérieur vers l'intérieur et de réduire la matrice par la cartographie des valeurs intérieures.
JS:
Vous pouvez l'obtenir sans boucles à l'aide de la suite.
Array
Array.le prototype.map
Array.le prototype.réduire
Array.le prototype.join
String.le prototype.split
Il est très élégant et il ne nécessite pas de dépendances telles que jQuery de Underscore.js.
Minifiés
Voici une démo, je l'ai jeté. Remarquez l'absence de boucles 🙂
JS:
CSS:
HTML:
ES6 1liners comme :
alors même que Óscar, mais que feriez-vous plutôt tourner dans le sens horaire :
J'ai trouvé les réponses ci-dessus soit difficile à lire ou trop verbeux, donc j'écris moi-même. Et je pense que c'est plus intuitif à mettre en œuvre transposer en algèbre linéaire, vous ne faites pas valeur d'échange, mais il suffit d'insérer chaque élément dans la bonne place dans la nouvelle matrice:
Je pense que c'est un peu plus lisible. Il utilise
Array.à partir de
et la logique est identique à l'aide de boucles imbriquées:JS:
Si vous êtes aux prises avec des tableaux de longueur inégale, vous devez remplacer
arr[0].length
avec quelque chose d'autre:JS: