Если вы хотите отобразить матрицу в шаблоне без какой-либо логики на стороне машинописного текста, вы можете использовать Array.prototype.slice , чтобы сгенерировать массив до вашего количества строк.Затем выполните итерацию в этом массиве с помощью ngFor
и получите индекс из переменной index
, это будет ваш индекс строки.
Затем снова используйте внутренние ngFor
и slice
, чтобы получить строку изваш массив и индекс строки.
Вы просто должны установить n
для количества элементов в строке:
<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>
См. эту демонстрацию stackblitz .
Однако я думаю, что более элегантным решением было бы создать матрицу из массива в машинописном тексте, а затем просто выполнить итерации по строкам и столбцам:
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));
<div *ngFor="let row of matrix">
<span *ngFor="let x of row">{{ x }}</span>
</div>
Или вы можете создать эту матрицу, используя трубу в угловую, что-то вроде этого, с длиной строки 4:
<div *ngFor="let row of arr | toMatrix:4">
<span *ngFor="let x of row">{{ x }}</span>
</div>
Тогда труба будет содержать логику для создания матрицы:
@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));
}
}