Tengo un formato de datos json:
[{'note':'n1','subject':'subject1','value':10},{'note':'n3','subject':'subject2','value':19}];
a partir de eso, generé dos matrices, una para columnas de cols y otra para rows
let notes = [{'note':'n1','subject':'subject1','value':10},{'note':'n3','subject':'subject2','value':19}]; let cols = ['n1', 'n2', 'n3']; let rows = ['subject1', 'subject2']; let matrix = Array(cols.length).fill(Array(rows.length).fill(0)); for(const x of notes){ let {note, subject, value} = x; matrix[cols.indexOf(note)][rows.indexOf(subject)] = note; } console.log(matrix)Resultado Esperado:
[[10,0,0],[0,0,19]] Pero mi objetivo es representarlo como una tabla HTML que se ve así:
| Asunto\Nota | Nota 1 | Nota 2 | Nota 3 |
|---|---|---|---|
| Sujeto1 | 10 | 0 | 0 |
| subj2 | 0 | 0 | 19 |
¿Cómo podría hacer eso? ¡Cualquier sugerencia o ayuda es muy apreciada!
Puedo pensar en un par de maneras de hacerlo. Una forma sería forEach columnas y rows usando cols y encontrar el valor coincidente en las notes o devolver 0 para construir la matriz de la siguiente manera:
let notes = [ {'note':'n1','subject':'subject1','value':10}, {'note':'n3','subject':'subject2','value':19} ] let cols = ['n1', 'n2', 'n3'] let rows = ['subject1', 'subject2'] let matrix = [] rows.forEach(row => { let newRow = [] cols.forEach(col => { newRow.push(notes.find(n => n.note === col && n.subject === row)?.value || 0) }) matrix.push(newRow) }) console.log(matrix) Otro método podría ser usar reduce para recorrer cols y rows para obtener su matriz:
let notes = [ {'note':'n1','subject':'subject1','value':10}, {'note':'n3','subject':'subject2','value':19} ] let cols = ['n1', 'n2', 'n3'] let rows = ['subject1', 'subject2'] let matrix = rows.reduce((accRow, row) => { accRow.push(cols.reduce((accCol, col) => { accCol.push(notes.find(n => n.note === col && n.subject === row)?.value || 0) return accCol }, [])) return accRow }, []) console.log(matrix)Estás en el camino correcto. Solo algunos puntos:
rows y columns mezcladas= note , debe tener = value . let notes = [{'note':'n1','subject':'subject1','value':10},{'note':'n3','subject':'subject2','value':19}]; let cols = ['n1', 'n2', 'n3']; let rows = ['subject1', 'subject2']; let matrix = Array(rows.length).fill().map(() => Array(cols.length).fill(0)); for(const x of notes) { let {note, subject, value} = x; matrix[rows.indexOf(subject)][cols.indexOf(note)] = value; } console.log(matrix)