Если вы хотите сделать это динамически, вы можете создать отформатированный массив с точками в массиве.
Попробуй так:
TS:
data = [
{
"grade": "A1",
"data": {
".Net": "6",
"Java": "7",
"Integration": "7"
}
},
{
"grade": "B1",
"data": {
".Net": "12",
"Java": "70",
"Integration": "56"
}
}
]
formattedData:any = []
columnHeaders: string[] = []
ngOnInit() {
this.columnHeaders = Object.keys(this.data[0].test)
this.data.forEach(element => {
let row = {
grade:element.grade,
points : Object.keys(element.test).map(key => element.test[key])
}
this.formattedData.push(row)
});
}
HTML:
<table class="table">
<tbody>
<tr>
<th></th>
<td *ngFor="let item of columnHeaders">{{item}}</td>
</tr>
<tr *ngFor="let item of formattedData">
<th>{{item.grade}}</th>
<td *ngFor="let point of item.points">{{point}}</td>
</tr>
</tbody>
</table>
Если вы хотите использовать keyValue , вообще не используйте formattedData и сделайте следующее:
<table class="table">
<tbody>
<tr>
<th></th>
<td *ngFor="let item of data[0].test | keyvalue">{{item.key}}</td>
</tr>
<tr *ngFor="let item of data">
<th>{{item.grade}}</th>
<td *ngFor="let sub of item.test | keyvalue">{{sub.value}}</td>
</tr>
</tbody>
</table>