web-dev-qa-db-ja.com

jQueryを介して配列にHTMLテーブルデータ

次のような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>

配列を取得します。

  • ヘッダーの配列
    • 列値の2次元配列(または各列の配列)

      JQueryを使用してこれを行うにはどうすればよいですか?

      チャートをレンダリングするために使用したいので、シリアル化したり、JSONオブジェクトに入れたりする必要はありません。


      関連する一般的な設計の質問:

      現時点で私は次のようなものを持っています

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

      jSONオブジェクトをajaxクエリからスローして戻し、そこからテーブルとチャートをレンダリングする方が理にかなっていますか?

  • 8
    sova

    何か このように

    $(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);
    });
    
    14
    simshaun

    デモが更新されました 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);
    
    10
    Ish

    それを行うさらに別の方法

    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()
                 );
    });
    
    3
    Jerome WAGNER

    次のようなもの:

    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();
        });
    });
    

    これにより、2つの配列が得られます。thArrayは見出しの配列であり、contentArrayは行と列を含む2次元配列です。contentArray['row1']['col0']は「値1,1」を返します

    実際、contentArrayにはthも含まれています...参照される 'row0'

    1
    Damien-Wright

    ここでも同じことをいじっていますが、すべてのテーブルを繰り返し処理し、ヘッダーと本体の配列を各テーブルのプロパティに書き込むことを好むので、元の回答を変更します。

    $(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

    1
    CervEd

    jSONオブジェクトをajaxクエリからスローして戻し、そこからテーブルとチャートをレンダリングする方が理にかなっていますか?

    そのとおり。 AJAXリクエストに応答してJSONを返すと、jQueryテンプレートなどを使用してテーブルをレンダリングし、同じ基になるデータを使用してグラフを生成することもできます。

    1
    Dave Ward

    'each'内のマップの代わりに再帰マップを使用するJeromeWagnerの回答の変更は次のとおりです。

    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();
    
    1
    Karen Zilles

    Ajax呼び出しからjson配列を取得し、そこからテーブル/チャートを生成する方が理にかなっていると思います。 jqueryテンプレートでは、これはまったく難しいことではありません。

    0
    Chris Westbrook

    次のコード行を使用します。

    var arrays = [];
    $('table').eq(0).find('tr').each((r,row) => arrays.Push($(row).find('td,th').map((c,cell) => $(cell).text()).toArray()))
    
    0
    Alaa Aref