Convert Table to an Array

后端 未结 5 1338
挽巷
挽巷 2020-12-14 04:43

I have seen many posts about how to turn an array into a table, but not nearly as many going the other way. I\'m looking to take a table like this:




        
相关标签:
5条回答
  • 2020-12-14 05:11
    var table = document.getElementById( "dataTable" );
    var tableArr = [];
    for ( var i = 1; i < table.rows.length; i++ ) {
        tableArr.push({
            category: table.rows[i].cells[0].innerHTML,
            brandName: table.rows[i].cells[1].innerHTML,
            whenObtained: table.rows[i].cells[2].innerHTML,
            howObtained: table.rows[i].cells[3].innerHTML,
            howOftenWorn: table.rows[i].cells[4].innerHTML,
            whereMade: table.rows[i].cells[5].innerHTML,
            hasGraphic: table.rows[i].cells[6].innerHTML
        });
    }
    
    0 讨论(0)
  • 2020-12-14 05:15

    See here for an example. I've included the relevant code below:

    $(function() {
        var $rows= $("#tableName tbody tr");      
        var data = [];
    
        $rows.each(function(row, v) {
            $(this).find("td").each(function(cell, v) {
                if (typeof data[cell] === 'undefined') {
                    data[cell] = [];
                }
                data[cell][row] = $(this).text();
            });
        });
    
        console.log(data);
    });
    
    0 讨论(0)
  • 2020-12-14 05:21

    So what I did is select all the tr elements and iterate over them. Next i check to make sure I am not looking at th elements. Then i use the cols array to populate the objects. This could have been simpler (2d array) but I use cols since that is what you had as your output.

    var i, items, item, dataItem, data = [];
    var cols = [ "category", "brandName", "whenObtained", "howObtained", "howOftenWorn",
     "whereMade", "hasGraphic" ];
    
    $("#dataTable tr").each(function() {
        items = $(this).children('td');
    
        if(items.length === 0) { // return if this tr only contains th
            return;
        }
    
        dataItem = {};
        for(i = 0; i < cols.length; i+=1) {
            item = items.eq(i);
            if(item) {
                dataItem[cols[i]] = item.html();
            }
        }
        data.push(dataItem);
    });
    
    0 讨论(0)
  • 2020-12-14 05:24

    The following should do it!

    var array = [];
    var headers = [];
    $('#dataTable th').each(function(index, item) {
        headers[index] = $(item).html();
    });
    $('#dataTable tr').has('td').each(function() {
        var arrayItem = {};
        $('td', $(this)).each(function(index, item) {
            arrayItem[headers[index]] = $(item).html();
        });
        array.push(arrayItem);
    });
    

    See here for jsFiddle

    0 讨论(0)
  • 2020-12-14 05:32

    There's a good tool: $(table).map, but saldly, it always return flatten array, no matter how many nested .map() is inside (you need two: one for rows and one for cells).

    So let's use jQuery.map for tables and tr's and object.map() for cells, having 2nd nesting level return an array

    function t2a (tabble){
    return $.map($(tabble),function(el,i) {
        return $.map($(el).find('tr'),function(el,i) {
            return [
                $(el).find('td').map(function() {
                    return $(this).text();
                }).get()
            ];
        });
    });
    }
    
    0 讨论(0)
提交回复
热议问题