3
votes

Afficher une matrice à l'aide d'un seul composant angulaire de tableau.html

J'ai un tableau supposant que [1,2,3,4,5,6,7,8,9,10] veut créer une matrice nxn du côté html de angulaire.

Je sais que je peux d'abord diviser le tableau en 2d dans le fichier dactylographié [[1,2,3,4,5], [6,7,8,9,10]] et parcourir les éléments de html en utilisant * ngFor.

Mais j'essaie de trouver un moyen d'afficher une matrice en utilisant un seul tableau dans component.html sans le convertir en tableau 2d.

sortie:

1 2 3 4 5
6 7 8 9 10


9 commentaires

Bienvenue dans StackOverflow! Veuillez fournir votre code là où vous avez essayé pour la première fois, et quels sont les problèmes que vous avez rencontrés.


Copie possible de Diviser le tableau en morceaux


@cgTag Ce n'est pas, s'il vous plaît lire, j'ai mentionné que je peux facilement diviser le tableau, mais comment simplement itérer en html angulaire sans fractionner.


Votre question ne m'est pas vraiment claire, pardon, pourriez-vous m'expliquer quel est le but de votre composant s'il vous plaît?


Utilisez une grille CSS. developer.mozilla.org/en-US/docs/Web/CSS/ CSS_Grid_Layout


Si vous ne souhaitez pas diviser le tableau, vous pouvez utiliser la mise en page CSS pour y parvenir. Pas besoin de code angulaire spécial. Définissez la largeur de la cellule contenant la valeur sur 1 / n la largeur du conteneur et utilisez display: inline-block. Mieux encore, utilisez une boîte flexible.


belle photo @cgTag, je pense que ce n'est pas une question liée aux maths / javascript, semble plus un problème de conception


@ccTag vérifie la réponse de jo_va


@Alessandro vérifie la réponse de jo_va


3 Réponses :


1
votes

Vous pouvez y parvenir en procédant comme suit. Je vais montrer les deux exemples, l'un avec un tableau 2d et l'autre avec un tableau unique.

Tableau 2d

var a = [1,2,3,4,5,6];

now to achieve 2D like functionality first define the strength of row.
let that be L. In our case strength of row will be L = 3.

now to get an element placed at Xth row and Yth column you will use
a[Z*(X-1)+ (Y-1)]
e.g. to get element form 1st row and 2nd column we will print 

a[3*(1-1) + (2-1)] = a[1];

Tableau 1D

var a = [[1,2,3],[4,5,6]];
now to get an element placed at Xth row and Yth column you will use

a[X-1][Y-1]
e.g. to get element form 1st row and 2nd column we will print 

a[1-1][2-1] = a[0][1];


0 commentaires

1
votes

Vous pouvez simplement utiliser l'opérateur % .

let nmatrix = (n) => {
  let temp = []
  for(let i=1;i <1+(n*n); i++){
    temp.push(i)
    if(i % n === 0) {
      console.log(...temp)
      temp = []
    }
  }
}


nmatrix(4)


0 commentaires

3
votes

Si vous souhaitez afficher la matrice dans le modèle sans aucune logique côté typographie, vous pouvez utiliser Array.prototype.slice pour générer un tableau aussi long que votre nombre de lignes. Ensuite, parcourez ce tableau avec ngFor et obtenez l'index de la variable index , ce sera votre index de ligne.

Ensuite, utilisez un ngFor code> et slice à nouveau pour obtenir la ligne de votre tableau et l'index de ligne.

Il vous suffit de définir n sur le nombre d'éléments par ligne:

@Pipe({
  name: 'toMatrix'
})
export class ToMatrixPipe implements PipeTransform {
  transform(arr: number[], n: number): number[][] {
    const rows = Array.from({ length: Math.ceil(arr.length / n) }, (_, i) => i);
    return rows.map(idx => arr.slice(idx * n, idx * n + n));
  }
}

Voir cette démo de stackblitz .

Cependant, je pense qu'une solution plus élégante serait de créer une matrice à partir du tableau en tapuscrit puis de simplement itérer sur les lignes et les colonnes:

<div *ngFor="let row of arr | toMatrix:4">
  <span *ngFor="let x of row">{{ x }}</span>
</div>
<div *ngFor="let row of matrix">
  <span *ngFor="let x of row">{{ x }}</span>
</div>

Ou vous pouvez créer cette matrice en utilisant un tube angulaire, quelque chose comme ceci, avec une longueur de ligne de 4:

const arr = [1,2,3,4,5,6,7,8,9,10];
const n = 4;
const matrix = Array
  .from({ length: Math.ceil(this.arr.length / this.n) }, (_, i) => i)
  .map(i => this.arr.slice(i * this.n, i * this.n + this.n));

Ensuite le tube contiendrait la logique pour créer la matrice:

<div *ngFor="let row of arr.slice(0, arr.length / n % 1 === 0 ? arr.length / n : arr.length / n + 1); let idx = index">
  <span *ngFor="let x of arr.slice(idx * n, idx * n + n)">{{ x }}</span>
</div>


5 commentaires

cela fonctionne à coup sûr, mais mieux vaut déplacer la logique de tranche dans le ts (avec les accessoires) et laisser le modèle vivre en paix (Y)


@Alessandro, je suis tout à fait d'accord avec vous mais l'OP voulait le faire côté HTML. Mais bien sûr, je préférerais le faire dans le ts et garder le modèle propre, j'ajouterai un avertissement à la réponse


@Zamir, j'ai ajouté un exemple avec un tuyau, pour déplacer la logique hors du modèle et le rendre réutilisable si nécessaire, vous pouvez également vérifier le Stackblitz mis à jour


Merci @ jo_va, je vais vérifier.Cependant, après avoir regardé les commentaires ci-dessus, je viens de créer une fonction en typographie pour convertir un tableau en tableau 2d à itérer en Html


@Zamir, c'est une bonne approche, j'ai également ajouté une solution dactylographiée pour rendre la réponse plus complète