Búsqueda de sitios web

javascript - Cómo usar un objeto clave-valor como fuente de datos para una tabla de Angular Material


Tengo una respuesta de API que se ve así:

{
  "2019-02-13": {
    "costs": 117,
    "commission": 271.07
  },
  "2019-02-14": {
    "costs": 123,
    "commission": 160.37
  },
  //etc..
}

Quiero usar este objeto como fuente de datos para mi tabla de datos de material, pero obtengo este error:

La fuente de datos proporcionada no coincide con un array, Observable o DataSource

Intenté usar una definición de celda como esta:

//cost
<td mat-cell *matCellDef="let item | keyvalue"> {{item.value.costs}} </td>
//date
<td mat-cell *matCellDef="let item | keyvalue"> {{item.key}} </td>

Pero eso no funcionó.

Por supuesto, podría recorrer mi objeto y hacer un arreglo así:

[
  {
    commission: 100,
    costs: 45
    date: '2019-02-13'
  },
  {
    commission: 100,
    costs: 45
    date: '2019-02-13'
  }
]

Esto probablemente solucionará mi problema, pero preferiría no hacer esto porque siento que es innecesario.

Editar

Lo arreglé agregando este código a mi llamada de servicio:

let data = [];
for (let key in response) {
  let value = response[key];
  let obj = {date: key, commission: value.commission, costs: value.costs}
  data.push(obj);
}
return data;

Respuesta #1

Si tuvieras dos interfaces:

interface Foo {
  [key:string]: myDataContent[];
}
interface myDataContent{
  costs: number;
  commission: number;
}

y una llamada de servicio que te devuelve Foo[] en una lista, por ejemplo lstValues y el resto debería ser fácil. La clave que podrías obtener de Object.keys

Artículos relacionados