我想从HTML表中提取数据

<table>
    <tr>
        <th> Header1 </th>
        <th> Header2 </th>
        <th> Header3 </th>
    </tr>
    <tr>
        <td> Value 1,1 </td>
        <td> Value 2,1 </td>
        <td> Value 3,1 </td>
    </tr>

    ... rows ...

</table>

并获得数组:

  • 标头的阵列
  • 列值的2D数组(或每个列的数组)

    我该如何使用jQuery?

    我不在乎它序列化或将其放入JSON对象,因为我想使用它来渲染图表。


    相关的一般设计问题:

    目前我有类似的东西

    1. ajax query returns html table
    2. use jQuery to get values from html table
    3. render chart
    

    将JSON对象从Ajax查询中扔回去,然后从那里渲染一个表格和图表更有意义?

  • 有帮助吗?

    解决方案

    某物 像这样?

    $(function() {
    
      var headers = $("span",$("#tblVersions")).map(function() { 
        return this.innerHTML;
      }).get();
    
      var rows = $("tbody tr",$("#tblVersions")).map(function() { 
        return [$("td:eq(0) input:checkbox:checked",this).map(function() { 
          return this.innerHTML;     
        }).get()];
      }).get();
    
      alert(rows);
    });
    

    其他提示

    演示更新了 http://jsfiddle.net/ish1301/cnsnk/

    var header = Array();
    
    $("table tr th").each(function(i, v){
            header[i] = $(this).text();
    })
    
    alert(header);
    
    var data = Array();
    
    $("table tr").each(function(i, v){
        data[i] = Array();
        $(this).children('td').each(function(ii, vv){
            data[i][ii] = $(this).text();
        }); 
    })
    
    alert(data);
    

    另一种做到这一点的方式

    var headers = jQuery('th').map(function(i,e) { return e.innerHTML;}).get();
    var datas = []
    jQuery.each(jQuery('tr:gt(0)'), function(i,e ) {
       datas.push(jQuery('td', e).map(function(i,e) {
                                         return e.innerHTML; 
                                      }).get()
                 );
    });
    

    与:

    var thArray = new Array();
    var contentArray = new Array();
    
    $('th').each(function(index) {
      thArray[index] =    $(this).html();
    })
    
    
    $('tr').each(function(indexParent) {
      contentArray['row'+indexParent] = new Array();
        $(this).children().each(function(indexChild) {
          contentArray['row'+indexParent]['col'+indexChild] = $(this).html();
        });
    });
    

    这给了您两个阵列, thArray 哪个是您的标题和 contentArray 这是一个包含行和列的2D数组: contentArray['row1']['col0'] 返回“值1,1”

    实际上,contentarray包含 th也...引用的'row0'

    将JSON对象从Ajax查询中扔回去,然后从那里渲染一个表格和图表更有意义?

    是的,一点没错。返回JSON,以响应您的AJAX请求,然后您可以使用诸如jQuery模板之类的内容渲染表,并使用相同的基础数据也生成图表。

    我在这里修补相同的东西,但是我更喜欢在所有表中迭代,并将标题和身体数组写入每个表的属性,因此,这是我对原始答案的修改:

    $(function() {
    $("table").each(function(){
      var $table = $(this),
          $headerCells = $("thead th", $(this)),
          $rows = $("tbody tr", $(this));
      var headers = [],
          rows = [];
    
    
    $headerCells.each(function(k,v) {
       headers[headers.length] = $(this).text();
      $table.prop("headAry", headers);
    });
    
    $rows.each(function(row,v) {
      $(this).find("td").each(function(cell,v) {
        if (typeof rows[cell] === 'undefined') rows[cell] = [];
        rows[cell][row] = $(this).text();
        $table.prop("bodAry", rows);
      });
    });
    console.log($(this).prop('headAry'));
    console.log($(this).prop('bodAry'));  
    });
    });
    

    Jsbin

    我认为从Ajax调用中获得JSON数组并从中生成您的表/图表更有意义。使用jQuery模板,这一点都不难。

    这是杰罗姆·瓦格纳(Jerome Wagner)的答案的修改,该答案使用递归地图,而不是“每个”中的地图:

    http://jsbin.com/oveva3/383/edit

      var headers = $("th",$("#meme")).map(function() { 
        return this.innerHTML;
      }).get();
    
      var rows = $("tbody tr",$("#meme")).map(function() { 
        return [$("td",this).map(function() { 
          return this.innerHTML;     
        }).get()];
      }).get();
    
    许可以下: CC-BY-SA归因
    不隶属于 StackOverflow
    scroll top