One of the common patterns I've come across in my many years of coding is the structuring/binding of the data coming from the server response (XMLHttpRequest). This problem of creating elements and appending them in a particular order as well as binding (attributes,events,content) is what I'm am trying to achieve here.
For example purposes and simplicity I am trying to create a tr --- td nested structure as well as bind the attributes from the var instructs object (table-row,table-data).
JSON Response (dummy data)
var response =[{"employeeNumber":"1002","lastName":"Murphy","firstName":"Diane","extension":"x5800","email":"[email protected]","officeCode":"1","reportsTo":null,"jobTitle":"President"},{"employeeNumber":"1056","lastName":"Patterson","firstName":"Mary","extension":"x4611","email":"[email protected]","officeCode":"1","reportsTo":"1002","jobTitle":"VP Sales"},{"employeeNumber":"1076","lastName":"Firrelli","firstName":"Jeff","extension":"x9273","email":"[email protected]","officeCode":"1","reportsTo":"1002","jobTitle":"VP Marketing"},{"employeeNumber":"1088","lastName":"Patterson","firstName":"William","extension":"x4871","email":"[email protected]","officeCode":"6","reportsTo":"1056","jobTitle":"Sales Manager (APAC)"},{"employeeNumber":"1102","lastName":"Bondur","firstName":"Gerard","extension":"x5408","email":"[email protected]","officeCode":"4","reportsTo":"1056","jobTitle":"Sale Manager (EMEA)"},{"employeeNumber":"1143","lastName":"Bow","firstName":"Anthony","extension":"x5428","email":"[email protected]","officeCode":"1","reportsTo":"1056","jobTitle":"Sales Manager (NA)"},{"employeeNumber":"1165","lastName":"Jennings","firstName":"Leslie","extension":"x3291","email":"[email protected]","officeCode":"1","reportsTo":"1143","jobTitle":"Sales Rep"},{"employeeNumber":"1166","lastName":"Thompson","firstName":"Leslie","extension":"x4065","email":"[email protected]","officeCode":"1","reportsTo":"1143","jobTitle":"Sales Rep"},{"employeeNumber":"1188","lastName":"Firrelli","firstName":"Julie","extension":"x2173","email":"[email protected]","officeCode":"2","reportsTo":"1143","jobTitle":"Sales Rep"},{"employeeNumber":"1216","lastName":"Patterson","firstName":"Steve","extension":"x4334","email":"[email protected]","officeCode":"2","reportsTo":"1143","jobTitle":"Sales Rep"},{"employeeNumber":"1286","lastName":"Tseng","firstName":"Foon Yue","extension":"x2248","email":"[email protected]","officeCode":"3","reportsTo":"1143","jobTitle":"Sales Rep"},{"employeeNumber":"1323","lastName":"Vanauf","firstName":"George","extension":"x4102","email":"[email protected]","officeCode":"3","reportsTo":"1143","jobTitle":"Sales Rep"},{"employeeNumber":"1337","lastName":"Bondur","firstName":"Loui","extension":"x6493","email":"[email protected]","officeCode":"4","reportsTo":"1102","jobTitle":"Sales Rep"},{"employeeNumber":"1370","lastName":"Hernandez","firstName":"Gerard","extension":"x2028","email":"[email protected]","officeCode":"4","reportsTo":"1102","jobTitle":"Sales Rep"},{"employeeNumber":"1401","lastName":"Castillo","firstName":"Pamela","extension":"x2759","email":"[email protected]","officeCode":"4","reportsTo":"1102","jobTitle":"Sales Rep"},{"employeeNumber":"1501","lastName":"Bott","firstName":"Larry","extension":"x2311","email":"[email protected]","officeCode":"7","reportsTo":"1102","jobTitle":"Sales Rep"},{"employeeNumber":"1504","lastName":"Jones","firstName":"Barry","extension":"x102","email":"[email protected]","officeCode":"7","reportsTo":"1102","jobTitle":"Sales Rep"},{"employeeNumber":"1611","lastName":"Fixter","firstName":"Andy","extension":"x101","email":"[email protected]","officeCode":"6","reportsTo":"1088","jobTitle":"Sales Rep"},{"employeeNumber":"1612","lastName":"Marsh","firstName":"Peter","extension":"x102","email":"[email protected]","officeCode":"6","reportsTo":"1088","jobTitle":"Sales Rep"},{"employeeNumber":"1619","lastName":"King","firstName":"Tom","extension":"x103","email":"[email protected]","officeCode":"6","reportsTo":"1088","jobTitle":"Sales Rep"},{"employeeNumber":"1621","lastName":"Nishi","firstName":"Mami","extension":"x101","email":"[email protected]","officeCode":"5","reportsTo":"1056","jobTitle":"Sales Rep"},{"employeeNumber":"1625","lastName":"Kato","firstName":"Yoshimi","extension":"x102","email":"[email protected]","officeCode":"5","reportsTo":"1621","jobTitle":"Sales Rep"},{"employeeNumber":"1702","lastName":"Gerard","firstName":"Martin","extension":"x2312","email":"[email protected]","officeCode":"4","reportsTo":"1102","jobTitle":"Sales Rep"}]; Binding (instructions)
var instructs={ tag:"tr", attributes:{class:"table-row"}, props:{ email:{ tag:"td", content: null, attributes:{class:"table-data",id:"table-data-id"} }, employeeNumber:{ tag:"td", attributes:{class:"table-data"}, content: null, props:{ x:{ tag: "input", attributes:{class:"table-input"}, content: "test" } } }, extension:{ tag:"td", content: null, attributes:{class:"table-data"} }, firstName:{ tag:"td", content: null, attributes:{class:"table-data"} }, jobTitle:{ tag:"td", content: null, attributes:{class:"table-data"} }, lastName:{ tag:"td", content: null, attributes:{class:"table-data"} }, officeCode:{ tag:"td", content: null, attributes:{class:"table-data"} }, reportsTo:{ tag:"td", content: null, attributes:{class:"table-data"} } } }; My Function (assemble)
function assemble(r,s,n){ var n = n || new DocumentFragment(); if(typeof r !== 'string'){ //HAS CHILDREN r.forEach((o)=>{ for(y in s){ switch(y){ case "tag": var tag = document.createElement(s[y]); n.appendChild(tag); break; case "attributes": for(a in s[y]) tag.setAttribute(a,s[y][a]); break; case "content": if(s.content === null){ //append current property value } else{ tag.innerHTML = s.content; } break; case "props": for(k in o) assemble(k,s[y][k],tag); //EXECUTE PER CHILDREN break; } } }); } else{ for(x in s){ switch(x){ case "tag": var tag = document.createElement(s[x]); n.appendChild(tag); break; case "content": if(s.content === null){ //append current property value } else{ tag.innerHTML = s.content; } break; case "attributes": for(a in s[x]) tag.setAttribute(a,s[x][a]); break; case "props": for(c in s[x]) assemble(r,s[x][c],tag); break; } } return n; } return n; } document.addEventListener('DOMContentLoaded',()=>{ var data = assemble(response,instructs); console.log(data); }); The end result I'm looking for is an array/fragment of nested tr>td both with a class attribute and the values append to the innerHTML.
<tr class ="table-row"> <td class="table-data">how do I bind the response values?</td> <td class="table-data">how do I bind the response values?</td> <td class="table-data">how do I bind the response values?</td> <td class="table-data">how do I bind the response values?</td> <td class="table-data">how do I bind the response values?</td> <td class="table-data">how do I bind the response values?</td> <td class="table-data">how do I bind the response values?</td> </tr> QUESTION:
How can I bind the property values from the response to the innerHTML of the td's?