将表格转换为数组

9

我看到很多关于如何将数组转换为表格的帖子,但几乎没有多少关于相反的情况。我想要将这样一个表格转换成数组:


<table id="dataTable">
    <tr>
        <th>Functional Category</th>
        <th>Brand Name</th>
        <th>When Obtained</th>
        <th>How Obtained</th>
        <th>How Often Worn</th>
        <th>Where Made</th>
        <th>Has a Graphic</th>
    </tr>
    <tr>
        <td>T-Shirt</td>
        <td>threadless</td>
        <td>Last 3 Months</td>
        <td>Purchased</td>
        <td>Monthly</td>
        <td>India</td>
        <td>Yes</td>
    </tr>
    <tr>
        <td>T-Shirt</td>
        <td>RVCA</td>
        <td>2 Years Ago</td>
        <td>Purchased</td>
        <td>Bi-Monthly</td>
        <td>Mexico</td>
        <td>Yes</td>
    </tr>
</table>

将其存储为以下格式的数组:


var tableData = [
    {
        category: "T-shirt",
        brandName: "threadless",
        whenObtained: "Last 3 Months",
        howObtained: "Purchased",
        howOftenWorn: "Monthly",
        whereMade: "India",
        hasGraphic: "Yes"
    },
    {
        category: "T-shirt",
        brandName: "RVCA",
        whenObtained: "2 Years Ago",
        howObtained: "Purchased",
        howOftenWorn: "Bi-Monthly",
        whereMade: "Mexico",
        hasGraphic: "Yes"
    }
]

我想使用jQuery来实现这个功能,想知道最好的方法是什么。

类似问题:https://dev59.com/4UrSa4cB1Zd3GeqPYrrJ - kamui
@JamesMontagne 我不确定该如何开始处理这个问题,因为它超出了我的当前技能水平。因此,很遗憾,我还没有尝试过任何东西。 - ayyp
如果我不想用JSON怎么办? - ayyp
5个回答

15

以下代码应该可以实现!

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

点击此处查看jsFiddle


2
$.each($('#dataTable th'), function(index, item) { 可以改为 $('#dataTable th').each(function(index, item) { - gen_Eric
如果我不想获取最后一列呢? - user8718405

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

1

请参考此处的示例。我已经在下面包含了相关代码:

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

1
所以我所做的是选择所有的元素并对它们进行迭代。接下来,我检查以确保我没有查看元素。然后我使用cols数组来填充对象。这可能可以更简单(2D数组),但我使用cols,因为那是您的输出。
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

有一个很好的工具:$(table).map,但不幸的是,它总是返回扁平化数组,无论内部有多少个嵌套的.map()(你需要两个:一个用于行,一个用于单元格)。

因此,让我们使用jQuery.map来处理表格和tr,使用object.map()来处理单元格,使第二个嵌套级别返回一个数组。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接