J'ai une table HTML que je crée à l'aide de données JSON, je crée ma table à l'aide de javascript uniquement et ma table est dynamique
J'ai un tableau de json à l'intérieur duquel j'ai plusieurs objets qui ont les données.
à partir de ce JSON, j'essaie de créer un tableau HTML
J'essaye de créer ce type de tableau:
La moyenne est comme la somme de toutes les factures annulées divisée par le nombre de points de vente, c'est pourquoi je calcule la longueur des points de vente et je la stocke dans une variable globale
Voici ce que j'ai fait jusqu'à présent:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css"> <div align="center" class="table table-responsive"> <table id="tblOlSalesSummary"></table> </div>
var outletCount = 0; //global variable to get the no of outlets var data = [{ "outlet": "JAYANAGAR", "cancelled": 126544, "duplicate": 1 }, { "outlet": "MALLESHWARAM", "cancelled": 31826, "duplicate": 31 }, { "outlet": "KOLAR", "cancelled": 10374, "duplicate": 10 } ]; let formatData = function(data) { //outlets is unique thats why formating it to loop forward in my code let outlets = []; data.forEach(element => { if (outlets.indexOf(element.outlet) == -1) { outlets.push(element.outlet); } }); outletCount = outlets.length //calculating outlet count return { data: data, outlets: outlets, }; }; let renderTable = function(data) { outlets = data.outlets; data = data.data; let tbl = document.getElementById("tblOlSalesSummary"); let table = document.createElement("table"); let thead = document.createElement("thead"); let headerRow = document.createElement("tr"); let th = document.createElement("th"); th.innerHTML = "Bill Type"; //header th.classList.add("text-center"); headerRow.appendChild(th); th = document.createElement("th"); th.innerHTML = "Average"; //header th.classList.add("text-center"); headerRow.appendChild(th); outlets.forEach(element => { th = document.createElement("th"); th.innerHTML = element; //this one is populating outlet as header th.classList.add("text-center"); headerRow.appendChild(th); }); thead.appendChild(headerRow); table.appendChild(thead); let tbody = document.createElement("tbody"); // from here onwards i don't know what to do let row = document.createElement("tr"); let total = 0; outlets.forEach(outlet => { //i am trying to loop through outlets but getting somthing else let el = 0; data.forEach(d => { if (d.outlet == outlet) { total += parseInt(d.cancelled); el = d.cancelled; } }); td = document.createElement("td"); td.innerHTML = el.toLocaleString('en-in'); td.classList.add("text-right"); row.appendChild(td); }); /* console.log("row is : " , row.children ) */ tbody.appendChild(row); table.appendChild(tbody); tbl.innerHTML = ""; tbl.appendChild(table); table.classList.add("table"); table.classList.add("table-striped"); table.classList.add("table-bordered"); table.classList.add("table-hover"); } let formatedData = formatData(data); renderTable(formatedData);
Je n'obtiens pas le point de boucler ma facture annulée et de dupliquer la facture par rapport aux points de vente, puis de calculer la moyenne.
3 Réponses :
Utilisez une bibliothèque qui peut créer des tables à partir de votre json.
Exemple:
<script> var t = {'<>':'div','html':'${title} ${year}'}; var d = [ {"title":"Heat","year":"1995"}, {"title":"Snatch","year":"2000"}, {"title":"Up","year":"2009"}, {"title":"Unforgiven","year":"1992"}, {"title":"Amadeus","year":"1984"} ]; document.write( json2html.transform(d,t) ); </script>
monsieur, je ne suis pas autorisé à utiliser une bibliothèque externe, c'est pourquoi je crée mon propre code avec javascript, aidez-moi si vous le pouvez.
J'ai écrit le code dans ce JSFiddle . Regarde. Il utilise JQuery.
HTML:
var data = [{ "outlet": "JAYANAGAR", "cancelled": 126544, "duplicate": 1 }, { "outlet": "MALLESHWARAM", "cancelled": 31826, "duplicate": 31 }, { "outlet": "KOLAR", "cancelled": 10374, "duplicate": 10 } ]; function draw() { var avgCancelled = 0; var avgDuplicate = 0; var totalCancelled = 0; var totalDuplicate = 0; for (var i = 0; i < data.length; i++) { totalCancelled += data[i].cancelled; totalDuplicate += data[i].duplicate; } avgCancelled = totalCancelled / data.length; avgDuplicate = totalDuplicate / data.length; drawTableHead() drawTableRows(avgCancelled, avgDuplicate) } function drawTableHead() { var row = $("<tr />"); $("#dataTable").append(row); row.append("<th>" + "BILLTYPE" + "</th>") row.append("<th>" + "AVERAGE" + "</th>") for (var i = 0; i < data.length; i++) { row.append("<th>" + data[i].outlet + "</th>") } } function drawTableRows(avgCancelled, avgDuplicate) { var firstRow = $("<tr />"); $("#dataTable").append(firstRow); firstRow.append("<td>" + "CANCELLED BILL" + "</td>") firstRow.append("<td>" + avgCancelled + "</td>") for (var i = 0; i < data.length; i++) { firstRow.append("<td>" + data[i].cancelled + "</td>") } var secondRow = $("<tr />"); $("#dataTable").append(secondRow); secondRow.append("<td>" + "DUPLICATE BILL" + "</td>") secondRow.append("<td>" + avgDuplicate + "</td>") for (var i = 0; i < data.length; i++) { secondRow.append("<td>" + data[i].duplicate + "</td>") } } draw();
JavaScript:
<table id="dataTable"> </table>
monsieur je veux calculer la moyenne aussi..comme annulé de (jayanagar + malleshwaram + kolar) / 2 = moy de manière similaire pour la facture en double aussi comme je l'ai mentionné dans mon message
les colonnes doivent-elles être dynamiques comme le montre l'image de votre question? comme JAYANAGAR, MALLESHWARAM, KOLAR ...... etc
oui monsieur le sont dynamiques ... c'est pourquoi dans mon code je calculais la longueur des prises
hé avec ce json [{"outlet": "JAYANAGAR", "cancelled": 38993, "duplicate": 0}, {"outlet": "MALLESHWARAM", "cancelled": 10057, "duplicate": 9 }, {"sortie": "KOLAR", "annulé": 3309, "dupliquer": 2}]
il donne une mauvaise moyenne pourquoi?
J'obtiens le résultat correct, remplace les données dans JSFiddle et exécute et vois le résultat
Il y avait deux colonnes de champs statiques dans votre table billtype
et average
qui devaient être ajoutées avant de boucler les données json
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css"> <div align="center" class="table table-responsive"> <table id="tblOlSalesSummary"></table> </div>
var outletCount = 0; //global variable to get the no of outlets var data = [{ "outlet": "JAYANAGAR", "cancelled": 126544, "duplicate": 1 }, { "outlet": "MALLESHWARAM", "cancelled": 31826, "duplicate": 31 }, { "outlet": "KOLAR", "cancelled": 10374, "duplicate": 10 }, { "outlet": "New Test", "cancelled": 154, "duplicate": 20 } ]; let formatData = function(data) { //outlets is unique thats why formating it to loop forward in my code let outlets = []; data.forEach(element => { if (outlets.indexOf(element.outlet) == -1) { outlets.push(element.outlet); } }); outletCount = outlets.length //calculating outlet count return { data: data, outlets: outlets, }; }; let renderTable = function(data) { outlets = data.outlets; data = data.data; let tbl = document.getElementById("tblOlSalesSummary"); let table = document.createElement("table"); let thead = document.createElement("thead"); let headerRow = document.createElement("tr"); let th = document.createElement("th"); th.innerHTML = "Bill Type"; //header th.classList.add("text-center"); headerRow.appendChild(th); th = document.createElement("th"); th.innerHTML = "Average"; //header th.classList.add("text-center"); headerRow.appendChild(th); outlets.forEach(element => { th = document.createElement("th"); th.innerHTML = element; //this one is populating outlet as header th.classList.add("text-center"); headerRow.appendChild(th); }); thead.appendChild(headerRow); table.appendChild(thead); let tbody = document.createElement("tbody"); // from here onwards i don't know what to do let row = document.createElement("tr"); let total = 0; // static field insertion for Cancelled bill let el = 'Cancelled bill'; td = document.createElement("td"); td.innerHTML = el.toLocaleString('en-in'); td.classList.add("text-right"); row.appendChild(td); // Logic start to find the average cancelled amount var total_cancel =0; total_can_count = 0; outlets.forEach(outlet => { data.forEach(d => { if (d.outlet == outlet) { total_cancel += parseInt(d.cancelled); total_can_count++; } }); }); let el_avg = ( total_cancel / (total_can_count) ); td = document.createElement("td"); td.innerHTML = el_avg.toLocaleString('en-in'); td.classList.add("text-right"); row.appendChild(td); // Logic End to find the average cancelled amount outlets.forEach(outlet => { let el = 0; data.forEach(d => { if (d.outlet == outlet) { total += parseInt(d.cancelled); el = d.cancelled; } }); td = document.createElement("td"); td.innerHTML = el.toLocaleString('en-in'); td.classList.add("text-right"); row.appendChild(td); }); /* console.log("row is : " , row.children ) */ tbody.appendChild(row); let row_duplicate = document.createElement("tr"); let total_dup = 0; // static field insertion for duplicate bill let el_2 = 'Duplicate bill'; td = document.createElement("td"); td.innerHTML = el_2.toLocaleString('en-in'); td.classList.add("text-right"); row_duplicate.appendChild(td); // Logic start to find the Duplicate average total_dup_count = 0; outlets.forEach(outlet => { data.forEach(d => { if (d.outlet == outlet) { total_dup += parseInt(d.duplicate); total_dup_count++; } }); }); let el_avg_2 = ( total_dup / (total_dup_count) ); td = document.createElement("td"); td.innerHTML = el_avg_2.toLocaleString('en-in'); td.classList.add("text-right"); row_duplicate.appendChild(td); // Logic End to find the Duplicate average outlets.forEach(outlet => { //i am trying to loop through outlets but getting somthing else let el = 0; data.forEach(d => { if (d.outlet == outlet) { total += parseInt(d.duplicate); el = d.duplicate; } }); td = document.createElement("td"); td.innerHTML = el.toLocaleString('en-in'); td.classList.add("text-right"); row_duplicate.appendChild(td); }); /* console.log("row is : " , row.children ) */ tbody.appendChild(row); tbody.appendChild(row_duplicate); table.appendChild(tbody); tbl.innerHTML = ""; tbl.appendChild(table); table.classList.add("table"); table.classList.add("table-striped"); table.classList.add("table-bordered"); table.classList.add("table-hover"); } let formatedData = formatData(data); renderTable(formatedData);
Hé, pouvez-vous consulter ce post une fois si vous avez un peu de temps stackoverflow.com/questions/56521258/… Je suis bloqué ici depuis longtemps
Votre disposition de table est-elle uniquement celle-ci ou est-elle dynamique? car si vous souhaitez la réutiliser, il peut être judicieux d'utiliser une bibliothèque externe ou de formater votre réponse json pour qu'elle soit plus appropriée aux formats de table