Ya tengo un informe creado en jspdf con un autotable en su lugar. Será para enumerar algunos datos sobre un estudiante cuya fuente está en una colección en Firestore. Ya he hecho la referencia a la colección con:
const ref = collection (“students”).doc(“selectedStudent”).collection(“grades”)En esa colección habrá un número indefinido de documentos. Cada uno de ellos es un objeto con muchos datos que ya tengo en su lugar:
De todos esos datos, solo usaría tres campos para llenar dinámicamente la tabla, por lo que el código de mi tabla sería el siguiente:
doc.autoTable({ head: [['Subject', 'Teacher', 'Achievements']], body: [ ['Subject1', 'Teacher1', 'Lorem ipsum'], ['Subject2', 'Teacher2', 'Lorem ipsum'], // ... ], })Sé que para lograrlo debo usar una función forEach o un bucle que recorra la colección, pero mi conocimiento es limitado y no sé cómo hacerlo. Esto es lo que he probado:
let keys = ['asignatura', 'authorApellidos', 'logros']; let bodyData = [], i, j, rowData; for (i = 0; i < ref.length; i++) { rowData = []; for (j = 0; j < keys.length; ++j) { let key = keys [j]; rowData.push (ref [i][key]); } bodyData.push (rowData); } doc.autoTable({ head: [['Asignatura', 'Profesor', 'Descripción']], startY: 137, headStyles: { fillColor: [50, 205, 50] }, body: bodyData })Sin embargo, tengo una tabla vacía donde solo veo la cabeza pero no hay datos.
Cuando hago un console.log(ref) lo que puedo ver en la consola es:
Tal vez los datos provenientes de Firebase deban formatearse. No sé.
Agradeceré cualquier ayuda. ¡Gracias!
puede usar .map para transformar cada elemento de una matriz en una matriz con la misma longitud y un formato de datos diferente
ejemplo:
doc.autoTable({ head: [['Subject', 'Teacher', 'Achievements']], body: ref.map(object => { return [object.subject, object.teacher, object.achievements]; }), });o desestructurar el objeto de la siguiente manera:
doc.autoTable({ head: [["Subject", "Teacher", "Achievements"]], body: ref.map(({subject, teacher, achievements}) => { // <-- object destructuration return [subject, teacher, achievements]; }), }); dado que esta función de map está devolviendo un nuevo formato directamente, puede omitir el retorno y hacer una sola línea
doc.autoTable({ head: [["Subject", "Teacher", "Achievements"]], body: ref.map(({subject, teacher, achievements}) => [subject, teacher, achievements]), });