Данные таблиц HTML в массивы через jQuery - PullRequest
7 голосов
/ 04 декабря 2010

Я хочу извлечь данные из 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, а затем отобразить таблицу и диаграммуоттуда?

Ответы [ 8 ]

14 голосов
/ 04 декабря 2010

Что-то как это ?

$(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);
});
9 голосов
/ 04 декабря 2010

демо обновлено 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);
3 голосов
/ 04 декабря 2010

еще один способ сделать это

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()
             );
});
1 голос
/ 20 марта 2013

Я возился с тем же, что и здесь, но я предпочитаю перебирать все таблицы и записывать массивы заголовков и тела в свойства каждой таблицы, так что вот мое изменение к первоначальному ответу:

$(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 голос
/ 04 декабря 2010

имеет ли смысл возвращать объект JSON из запроса ajax, а затем отображать таблицу и диаграмму оттуда?

Да, абсолютно. Верните JSON в ответ на ваш AJAX-запрос, затем вы можете отобразить таблицу, используя что-то вроде jQuery Templates, и использовать те же базовые данные для создания диаграммы.

1 голос
/ 04 декабря 2010

Что-то вроде:

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, который представляет собой двумерный массив, содержащий строки и столбцы: contentArray['row1']['col0'] возвращает "Значение 1,1"

На самом деле, contentArray также содержит th ... ссылается на 'row0'

0 голосов
/ 22 января 2013

Вот модификация ответа Джерома Вагнера, который использует рекурсивные карты вместо карты внутри «каждого»:

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();
0 голосов
/ 04 декабря 2010

Я думаю, что было бы более разумно получить массив json обратно из вызова ajax и сгенерировать вашу таблицу / диаграмму из этого. С шаблонами jquery это совсем не сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...