从 JSON 数据获取动态表的列标题

Posted

技术标签:

【中文标题】从 JSON 数据获取动态表的列标题【英文标题】:Getting Column Heading for Dynamic Table from JSON data 【发布时间】:2021-09-01 07:18:38 【问题描述】:

我有一个动态表(从下拉选择中选择的列)从 JSON 中获取数据。表格的列标题是 JSON 数据的一部分。

我正在使用它从 JSON 中捕获列标题,但它以“未定义”的形式出现。

jQuery.each(data, function(k, v) 
      html += '<th id="myHeader">' + v.ColHeading + '</th>';
    );

他们的数据不会被捕获为列标题,而是作为表格的第一行。我需要的是 'ColHeading' 值以反映为列标题,而 'Height' 和 'Weight' 将成为我表中的第一行和第二行。

JSON 如下:

var StatJSON = 
        "Option1": 
            "ColHeading": "Volvo",
            "Height": "aaa cm",
            "Weight": "xxx kg",
        ,
        "Option2": 
            "ColHeading": "Mercedes",
            "Height": "bbb cm",
            "Weight": "yyy kg",
        ,
        "Option3": 
            "ColHeading": "Maruti",
            "Height": "ccc cm",
            "Weight": "zzz kg",
        ,
    ;

获取数据入表的jQuery如下:

function PrintTable(data) 
  var html = '<table class="compTable"><thead><tr><th>';
  if (data && data.length) 
    html += '</th>';
    jQuery.each(data, function(k, v) 
      html += '<th id="myHeader">' + v.ColHeading + '</th>';
    );
    html += '</tr>';
    html += '<tbody>';
    jQuery.each(StatJSON[data[0]], function(k, v) 
      html += '<tr><td>' + k + '</td>';
        jQuery.each(data, function(k2, v2) 
        html += '<td>' + StatJSON[data[k2]][k] + '</td>';
      );
      html += '</tr>';
    );
   else  html += 'No results found</td></tr>'; 
  html += '</tbody></table>';
  return html;

找到下面的工作代码:

jQuery(document).ready(function($) 

  var StatJSON = 
    "Option1": 
      "ColHeading": "Volvo",
      "Height": "aaa cm",
      "Weight": "xxx kg",
    ,
    "Option2": 
      "ColHeading": "Mercedes",
      "Height": "bbb cm",
      "Weight": "yyy kg",
    ,
    "Option3": 
      "ColHeading": "Maruti",
      "Height": "ccc cm",
      "Weight": "zzz kg",
    ,
  ;

  jQuery('#btnSubmit').click(function() 
    var data = [];
    jQuery("#selection").find(':selected').each(function(e) 
      var this_input = jQuery(this);
      if (this_input.is(':selected')) 
        data.push(this_input.val());
      
    );

    $('#divResult').empty().append(PrintTable(data));

    function PrintTable(data) 
      var html = '<table class="compTable"><thead><tr><th>';
      if (data && data.length) 
        html += '</th>';
        jQuery.each(data, function(k, v) 
          html += '<th id="myHeader">' + v.ColHeading + '</th>';
        );
        html += '</tr>';
        html += '<tbody>';
        jQuery.each(StatJSON[data[0]], function(k, v) 
          html += '<tr><td>' + k + '</td>';
          jQuery.each(data, function(k2, v2) 
            html += '<td>' + StatJSON[data[k2]][k] + '</td>';
          );
          html += '</tr>';
        );
       else 
        html += 'No results found</td></tr>';
      
      html += '</tbody></table>';
      return html;
    

  );

);
body 
  font-family: montserratbold, montserratregular, sans-serif;


.divResult 
  overflow: scroll;
  position: relative;


.compTable 
  font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
  margin: 10px;
  border: 1px solid #222;
  text-align: center;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<select id="selection" multiple="multiple">
  <option value="Option1">Volvo</option>
  <option value="Option2">Mercedes</option>
  <option value="Option3">Maruti</option>
  <br />
  <input id="btnSubmit" class="button" type="submit" value="submit" />
</select>
<br /><br />
<div id="divResult" class="divResult"></div>

【问题讨论】:

【参考方案1】:

您可以使用StatJSON[data[i]].ColHeading 获取键匹配的值并将它们添加到您的th 标记中。此外,如果键是ColHeading,则在 tbody 中使用 if(k !="ColHeading").. 进行迭代忽略该值。

演示代码

jQuery(document).ready(function($) 

  var StatJSON = 
    "Option1": 
      "ColHeading": "Volvo",
      "Height": "aaa cm",
      "Weight": "xxx kg",
    ,
    "Option2": 
      "ColHeading": "Mercedes",
      "Height": "bbb cm",
      "Weight": "yyy kg",
    ,
    "Option3": 
      "ColHeading": "Maruti",
      "Height": "ccc cm",
      "Weight": "zzz kg",
    ,
  ;

  jQuery('#btnSubmit').click(function() 
    var data = [];
    jQuery("#selection").find(':selected').each(function(e) 
      var this_input = jQuery(this);
      if (this_input.is(':selected')) 
        data.push(this_input.val());
      
    );

    $('#divResult').empty().append(PrintTable(data));

    function PrintTable(data) 
      var html = '<table class="compTable"><thead><tr><th>';
      if (data && data.length) 
        html += '</th>';

        jQuery.each(data, function(i) 
          //getting heading at that key
          html += '<th>' + StatJSON[data[i]].ColHeading + '</th>';
        );
        html += '</tr>';
        html += '<tbody>';
        jQuery.each(StatJSON[data[0]], function(k, v) 
          html += "<tr>"
          if (k != "ColHeading") 
            html += "<td>" + k + "</td>"
          
         
          jQuery.each(data, function(k2, v2) 
            if (k != "ColHeading") 
              html += '<td>' + StatJSON[data[k2]][k] + '</td>';
            
          );
          html += '</tr>';
        );
       else 
        html += 'No results found</td></tr>';
      
      html += '</tbody></table>';
      return html;
    

  );

);
body 
  font-family: montserratbold, montserratregular, sans-serif;


.divResult 
  overflow: scroll;
  position: relative;


.compTable 
  font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
  margin: 10px;
  border: 1px solid #222;
  text-align: center;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<select id="selection" multiple="multiple">
  <option value="Option1">Volvo</option>
  <option value="Option2">Mercedes</option>
  <option value="Option3">Maruti</option>
  <br />
  <input id="btnSubmit" class="button" type="submit" value="submit" />
</select>
<br /><br />
<div id="divResult" class="divResult"></div>

【讨论】:

以上是关于从 JSON 数据获取动态表的列标题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用javascript从数据库中向动态表中添加不同的列

如何在从服务器获取数据的动态表的每一行中添加下拉列表?

过滤后动态添加到表的行不隐藏

power query展开表时动态获取要展开的列

SSIS 动态表和数据流中的列数

在 s-s-rS Report Builder Execute(@Query) 中对列标题使用动态 SQL - 使用来自 1 个表的值作为来自不同表的值的列标题