Me gustaría insertar datos JSON analizados en una tabla HTML a través de Javascript. Creo que estoy cerca de una solución, pero no puedo descifrar el paso final.
Objetivo: necesito insertar el nombre, la edad, la identidad secreta y los poderes de tres superhéroes en sus respectivas columnas en una tabla. Los datos provienen de un archivo JSON. Lo analicé y está listo para usar en Javascript. Quiero recorrer los objetos dentro de los datos e insertar los datos correctos en las celdas. No tengo permitido usar jQuery o técnicas similares.
Problema: el problema es que parece que no puedo recorrer los objetos (nombre, edad, etc.) para cada superhéroe y agregarlo a la celda. ¿Cómo apunto/hago referencia a los objetos para usarlos en un bucle? Por ejemplo, esto 'funciona', pero da un resultado incorrecto ya que no quiero recorrer los nombres:
Código JavaScript:
for(i = 0; i < members.length; i++) { function addRow(tableID) { let tableRef = document.getElementById(tableID); let newRow = tableRef.insertRow(-1); for(x = 0; x < 4; x++) { let newCell = newRow.insertCell(0); let newText = document.createTextNode(members[i].name); newCell.appendChild(newText); }
En cambio, quiero recorrer el objeto de esta manera, de manera horizontal.
Solución esperada: espero que la solución se vea así, pero no funciona:
for(x = 0; x < 4; x++) { let newCell = newRow.insertCell(0); let newText = document.createTextNode(members[i].obj[x]); newCell.appendChild(newText);
datos JSON:
const data = [ { squadName : 'Super Hero Squad' , homeTown : 'Metro City' , formed : 2016 , secretBase : 'Super tower' , active : true , members : [ { name : 'Molecule Man' , age : 29 , secretIdentity : 'Dan Jukes' , powers : [ 'Radiation resistance' , 'Turning tiny' , 'Radiation blast' ] } , { name : 'Madame Uppercut' , age : 39 , secretIdentity : 'Jane Wilson' , powers : [ 'Million tonne punch' , 'Damage resistance' , 'Superhuman reflexes' ] } ] } //, {} ]
¿Hay alguien que pueda ayudar? ¡Gracias por adelantado!
Simplemente recorra cada propiedad del member[i]
for (i = 0; i < members.length; i++) { addRow('table', members[i]); } function addRow(tableID, member) { let tableRef = document.getElementById(tableID); let newRow = tableRef.insertRow(-1); for (let prop in member) { let newCell = newRow.insertCell(-1); let newText = document.createTextNode(member[prop]); newCell.appendChild(newText); } }
No estoy 100% seguro de qué columnas necesita, pero creo que esto se acerca a lo que quería. Con suerte, puede ver el patrón general para crear un elemento DOM, llenarlo con datos y agregarlo a la tabla.
const data = [ { squadName : 'Super Hero Squad' , homeTown : 'Metro City' , formed : 2016 , secretBase : 'Super tower' , active : true , members : [ { name : 'Molecule Man' , age : 29 , secretIdentity : 'Dan Jukes' , powers : [ 'Radiation resistance' , 'Turning tiny' , 'Radiation blast' ] } , { name : 'Madame Uppercut' , age : 39 , secretIdentity : 'Jane Wilson' , powers : [ 'Million tonne punch' , 'Damage resistance' , 'Superhuman reflexes' ] } ] } //, {} ] const table = document.getElementById('root'); data.forEach(squad => { squad.members.forEach(hero => { const tr = document.createElement("tr") const nameTd = document.createElement("td") nameTd.append(hero.name) const ageTd = document.createElement("td") ageTd.append(hero.age) const secretTd = document.createElement("td") secretTd.append(hero.secretIdentity) const powersTd = document.createElement("td") powersTd.append(hero.powers.join(', ')) tr.append(nameTd) tr.append(ageTd) tr.append(secretTd) tr.append(powersTd) table.append(tr) }) })
td { border: solid black 1px; }
<table id="root"> </table>
Lo que está buscando en el bucle anidado, el horizontal, es "for in". "for in" recorrerá las propiedades de un Objeto. Consulte este artículo
https://www.w3schools.com/js/js_loop_forin.asp
Pero no le recomiendo que use este método: simplemente acceda al valor de la clave para generar cada columna ( <td>
), porque el orden de las claves no está garantizado en un bucle. Aún debe verificar la clave en el bucle anidado para que sea seguro.
¿JavaScript garantiza el orden de las propiedades de los objetos?