ammar
ammar

Reputation: 131

Table is not created as expected

I'm trying to create a table to represent data extracted from firebase RT database, I have the following data in json format:

var jsonData =
            {
                availability: {
                    supermarket01: {
                        '2342342': {
                            green100: 'no',
                            green200: 'yes',
                            red200: 'yes',
                            yellow: 'no',
                            purple100: 'yes',
                            cyan100: 'no'
                        },
                        '58943792': {
                            green200: 'yes',
                            orange200: 'yes',
                            red200: 'no'
                        },
                        '398489593': {
                            green200: 'no',
                            orange200: 'no',
                            red200: 'yes'
                        },
                        '1605290957000': {
                            orange: 'yes',
                            green2123: 'no',
                            green222: 'yes'
                        }
                    },
                    supermarket02: {
                        '23423423': {
                            green200: 'yes',
                            orange200: 'no',
                            red200: 'no'
                        },
                        '23947928': {
                            green200: 'yes',
                            orange200: 'no',
                            red200: 'yes'
                        }
                    }
                }
            }

I want to create a table which looks somehing like the photo below:

table

but I'm getting a table which looks like this:

table01

what I've tried so far:

function jsonTabulizer(jsonData, selector) {
    var reportType = [],
        storeKeys = [],
        reportKeys = [],
        productKeys = [],
        table = document.createElement("table"),
        row = table.insertRow();
    reportType = Object.keys(jsonData);
    storeKeys = Object.keys(jsonData[reportType]);
    for (j = 0; j < storeKeys.length; j++) {
        reportKeys[j] = Object.keys(jsonData[reportType][storeKeys[j]]);
        var cell = row.insertCell();
        cell.innerHTML = storeKeys[j];
        console.log(reportKeys[j].length);
        cell.setAttribute("rowSpan", reportKeys[j].length);
        for (k = 0; k < reportKeys[j].length; k++) {
            productKeys[j] = Object.keys(jsonData[reportType][storeKeys[j]][reportKeys[j][k]]);
            row = table.insertRow();
            cell = row.insertCell();
            cell.innerHTML = reportKeys[j][k];
            // console.log(productKeys[j]);
        }
    }
    document.getElementById("test_table").appendChild(table);
}

and in html body:

<div id="test_table"></div>

can anyone help me to achieve this. Thanks

Upvotes: 1

Views: 73

Answers (1)

Swati
Swati

Reputation: 28522

You need to create new row in each iteration so your row = table.insertRow(); line is outside first loop it should be inside .Then , first td in every tr will have total rowspan depending on keys length so you need to add get total length and set rowspan of first td same for other trs.

Demo Code :

var jsonData = {
  availability: {
    supermarket01: {
      '2342342': {
        green100: 'no',
        green200: 'yes',
        red200: 'yes',
        yellow: 'no',
        purple100: 'yes',
        cyan100: 'no'
      },
      '58943792': {
        green200: 'yes',
        orange200: 'yes',
        red200: 'no'
      },
      '398489593': {
        green200: 'no',
        orange200: 'no',
        red200: 'yes'
      },
      '1605290957000': {
        orange: 'yes',
        green2123: 'no',
        green222: 'yes'
      }
    },
    supermarket02: {
      '23423423': {
        green200: 'yes',
        orange200: 'no',
        red200: 'no'
      },
      '23947928': {
        green200: 'yes',
        orange200: 'no',
        red200: 'yes'
      }
    }
  }
}
jsonTabulizer(jsonData)

function jsonTabulizer(jsonData, selector) {
  var reportType = [],
    storeKeys = [],
    reportKeys = [],
    productKeys = [],
    table = document.createElement("table"),

    reportType = Object.keys(jsonData);
  storeKeys = Object.keys(jsonData[reportType]);
  for (j = 0; j < storeKeys.length; j++) {
    var rowspan = 0; //decalre this
    reportKeys[j] = Object.keys(jsonData[reportType][storeKeys[j]]);

    var row = table.insertRow(); //put this line inside
    var cell1 = row.insertCell();
    cell1.innerHTML = storeKeys[j];
    rowspan += reportKeys[j].length //outer array length

    for (k = 0; k < reportKeys[j].length; k++) {
      productKeys[j] = Object.keys(jsonData[reportType][storeKeys[j]][reportKeys[j][k]]);
      rowspan += productKeys[j].length
      var row = table.insertRow();
      cell = row.insertCell();
      cell.innerHTML = reportKeys[j][k];
      cell.setAttribute("rowspan", parseInt(productKeys[j].length + 1)); //add rowspan 
      for (m = 0; m < productKeys[j].length; m++) {
        var row = table.insertRow();
        cell = row.insertCell();
        cell.innerHTML = productKeys[j][m]; //(yellow, red ..key)
        cell = row.insertCell();
        cell.innerHTML = jsonData[reportType][storeKeys[j]][reportKeys[j][k]][productKeys[j][m]]; //value (yes,no..)

      }

    }
    cell1.setAttribute("rowspan", parseInt(rowspan + 1)); //add rowspan to first tds 
  }
  document.getElementById("test_table").appendChild(table);
}
table,
th,
td {
  border: 1px solid black;
}

table {
  border-collapse: collapse;
  border-spacing: 0px;
}
<div id="test_table"></div>

Upvotes: 1

Related Questions