I have created an HTML table which will generate infinite columns based on the number of rows in the input data. I\'ve tried to use this SO p
the only thing you need is "loop" the matColumnDef. -see that we use [matColumnDef]
and {{element[col]}}
If your table is like
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<ng-container *ngFor="let col of displayedColumns" [matColumnDef]="col">
<th mat-header-cell *matHeaderCellDef>{{col}}</th>
<td mat-cell *matCellDef="let element"> {{element[col]}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
You only need transform your data and indicate the displayedColumns. You can do in a ngOnInit()
ngOnInit() {
const head = this.data.map(x => x.name)
const data: any[] = [];
this.data.forEach((x, index) => {
Object.keys(x).forEach((k, index2) => {
data[index2] = data[index2] || {}
data[index2][head[index]] = x[k]
})
})
this.displayedColumns=head;
this.dataSource = data.slice(1); //I remove the first element that was the "header"
}
See in stackblitz