Angular dynamic table using ngFor

前端 未结 2 1159
孤街浪徒
孤街浪徒 2021-01-05 08:23

I would like to know if it is possible to create a dynamic HTML table from JSON data. The amount of columns and headers should change according to the keys in the JSON. For

相关标签:
2条回答
  • 2021-01-05 08:57

    If you want to get the key of your object as the head of your table, you should create a custom pipe.

    import { PipeTransform, Pipe } from '@angular/core';
    
    @Pipe({name: 'keys'})
    export class KeysPipe implements PipeTransform {
      transform(value, args:string[]) : any {
        let keys = [];
        for (let key in value) {
          keys.push(key);
        }
        return keys;
      }
    }
    

    Update: Or simply return keys using Object.keys(). (demo)

    @Pipe({name: 'keys'})
    export class KeysPipe implements PipeTransform {
      transform(value, args:string[]) : any {
        return Object.keys(value);
      }
    }
    

    Now into your html template:

    <table>
      <thead>
        <tr>           
          <th *ngFor="let head of items[0] | keys">{{head}}</th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let item of items">           
          <td *ngFor="let list of item | keys">{{item[list]}}</td>
        </tr>
      </tbody>
    </table>
    

    Update: Here is the demo.

    0 讨论(0)
  • 2021-01-05 09:02

    This can help:

    export class AppComponent {
     //Array of any value
      jsonData:any = [
        {id: "1", type: "bus", make: "VW", color: "white"},
        {id: "2", type: "taxi", make: "BMW", color: "blue"}
      ];
      _object = Object;
    }
    <div>
      <table border="1">
        <thead>
          <tr>
            <th *ngFor="let header of _object.keys(jsonData[0]); let i = index">{{header}}</th>
          </tr>
        </thead>
        <tbody>
          <tr *ngFor="let row of jsonData; let i = index">
            <th *ngFor="let objKey of _object.keys(row); let j = index">{{ row[objKey] }} </th>
          </tr>
        </tbody>
      </table>
    </div>

    0 讨论(0)
提交回复
热议问题