HTML表格中的动态和复杂行距

Mag*_*aar 6 html javascript jquery

链接到JSFiddle

这是我的JSON格式

{
    "result": {
        "buildname1": [{
            "table1": ["xxx","yyy"]
        }, {
            "table2": ["xxx","yyy"]
        }, {
            "table3": ["xxx","yyy"]
        }],
        "buildname2": [{
            "table1": ["xxx","yyy"]
        }, {
            "table2": ["xxx","yyy"]
        }, {
            "table3": ["xxx","yyy"]
        }]
    },
    "Build sets": "yyy",
    "destinationPath": "xxx",
    "status": 1
}
Run Code Online (Sandbox Code Playgroud)

这是我用来动态创建表的函数.

function generateTable(data){ //data is the parsed JSON Object from an ajax request
    $("#test-table tbody").empty();//Empty the table first
    if(data.result != null){
        $.each(data.result,function(key,value){
            var buildName ="<tr><td rowspan='"+value.length+"'>"+key+"<span class='cyan darken-1 white-text badge'>"+value.length+" base tables</span></td>";
            var baseTable ="";
            for(i=0;i<value.length;i++){
                if( i == 0 ){
                    for(var k in value[0]){
                        baseTable ="<td rowspan='"+value[0][k].length+"'>"+k+"</td></tr>";
                    }
                }
                else{
                    for(var key in value[i]){
                        baseTable = baseTable + "<tr><td rowspan='"+value[i][key].length+"'>"+key+"</td></tr>";
                    }
                }
            }
            $("#test-table").append(buildName + baseTable);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标

在此输入图像描述

HTML

<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th><th>Base Table</th><th>Query List</th>
    </tr>
  </thead>
</table>
Run Code Online (Sandbox Code Playgroud)

题 :

我成功地创建了前两列(虽然有点难看,以为我可以稍后改进它),我被困在第三列.我发布的代码正确地创建了前两列,但是在rowspan(第三列)中的rowspan逻辑似乎无法实现.请指导我.

mho*_*ges 5

老实说rowspan,我以前从未使用过,但是在阅读了此堆栈答案后,我对它的理解要好得多-我强烈建议您这样做。之后,只需要弄清楚从JSON到DOM的元素顺序即可。

这是一个工作示例:

var data = '{"result":{"buildname1":[{"table1":["xxx","yyy", "zzz"]},{"table2":["xxx","yyy"]}],"buildname2":[{"table1":["xxx","yyy", "zzz"]},{"table2":["xxx","yyy"]},{"table3":["xxx","yyy"]}]},"Build sets":"yyy","destinationPath":"xxx","status":1}';

function generateTable(data) { //data is the parsed JSON Object from an ajax request
  data = JSON.parse(data);
  $("#test-table tbody").empty(); //Empty the table first   
  $.each(data.result, function(key, elem) {
    var baseHtml = "";
    var childrenHtml = "";
    var maxRowSpan = 0;
    $.each(elem, function(index, inner_elem) {
      var innerElemKey = Object.keys(inner_elem)[0];
      var arr = inner_elem[innerElemKey];
      var elemRowSpan = arr.length;
      maxRowSpan += arr.length;

      if (index === 0) {
        childrenHtml += ('<td rowspan="' + elemRowSpan + '">' + innerElemKey + '</td>');
        $.each(arr, function(indx, child) {
          if (indx === 0) {
            childrenHtml += ('<td rowspan="1">' + child + '</td>' + '</tr>');
          } else {
            childrenHtml += ('<tr><td rowspan="1">' + child + '</td>' + '</tr>');
          }
        });
      } else {
        childrenHtml += ('<tr><td rowspan="' + elemRowSpan + '">' + innerElemKey + '</td>');
        $.each(arr, function(indx, child) {
          if (indx === 0) {
            childrenHtml += ('<td rowspan="1">' + child + '</td>' + '</tr>');
          } else {
            childrenHtml += ('<tr><td rowspan="1">' + child + '</td>' + '</tr>');
          }
        });
      }
    });
    baseHtml += ('<tr><td rowspan="' + maxRowSpan + '">' + key + '</td>');
    $("#test-table").append(baseHtml + childrenHtml);
  });
}

$(function() {
  generateTable(data);
});
Run Code Online (Sandbox Code Playgroud)
td {
  border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th>
      <th>Base Table</th>
      <th>Query List</th>
    </tr>
  </thead>
</table>
Run Code Online (Sandbox Code Playgroud)

静态HTML

<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th><th>Base Table</th><th>Query List</th>
    </tr>
  </thead>
</table>
Run Code Online (Sandbox Code Playgroud)

生成的HTML

<table id="test-table" class="bordered responsive-table">
  <thead>
    <tr>
      <th>Build Name</th>
      <th>Base Table</th>
      <th>Query List</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="5">buildname1</td>
      <td rowspan="3">table1</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="1">zzz</td>
    </tr>
    <tr>
      <td rowspan="2">table2</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="7">buildname2</td>
      <td rowspan="3">table1</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="1">zzz</td>
    </tr>
    <tr>
      <td rowspan="2">table2</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
    <tr>
      <td rowspan="2">table3</td>
      <td rowspan="1">xxx</td>
    </tr>
    <tr>
      <td rowspan="1">yyy</td>
    </tr>
  </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)