【问题标题】:Html table to array of jsonHtml 表到 json 数组
【发布时间】:2013-08-02 01:29:01
【问题描述】:

我有动态行和列的表,我试图通过循环遍历每个 tr 和 td 并在文本框中查找值但没有运气。这是我的 js 代码。

 $("#btn_Table2Json").click(function () {
        var rows = [];
        $('table.dynatable tbody tr').each(function (i, n) {
            var $row = $(n);
            if (n.className.toUpperCase() != "Prototype".toUpperCase() && n.className.toUpperCase() != "Header".toUpperCase()) {
                $('table.dynatable tbody td').each(function (j, d) {
                    rows.push({
                        //Here id,Name,Address,Contact are dynamic.so need to find it inside of 'th' of table.
                        //but i am not being able to find it, so i just hard coded it :(
                        Id: $row.find('td:eq(0)').text(),
                        Name: $row.find('td:eq(1)').text(),
                        Address: $row.find('td:eq(2)').text(),
                        Contact: $row.find('td:eq(2)').text()
                    });
                });
            }
        });
        //debugger;
        alert(JSON.stringify(rows));
        //alert(table.toString());
    });

对于上表的 JSON 输出应该是:

[{ID:"1",Name:"Bibek",Address:"lubhoo",Contact:"98411"},{ID:"4",Name:"Suraj",Address:"Sanagaun",Contact:"984511"}]

我的 Html 是(列和行是动态的)

<table class="dynatable">
        <thead>
            <tr class="Header">
                <th id="AddRowTh"><button class="add">Add Row</button></th>
                <th>ID &nbsp;&nbsp;<a href="#" class="RemoveColumn">Remove</a></th>
                <th>Name&nbsp;&nbsp;<a href="#" class="RemoveColumn">Remove</a></th>
                <th>Address&nbsp;&nbsp;<a href="#" class="RemoveColumn">Remove</a></th>
                <th>Contact&nbsp;&nbsp;<a href="#" class="RemoveColumn">Remove</a></th>
                <th id="AddColumnTh"><button style="width: 100px; height: 25px" class="addColumn">Add Column</button></th>
            </tr>
        </thead>
        <tbody>
            <tr class="prototype">
                <td><p class="RowName"></p><a href="#" class="RemoveRow">Remove</a><!--<button class="remove">Remove</button>--></td>
                <td><input type="text" name="id[]" value="0" class="id" /></td>
                <td><input type="text" name="name[]" value="" /></td>
                <td><input type="text" name="col4[]" value="" /></td>
                <td><input type="text" name="col3[]" value="" /></td>
            </tr>
    </table>

【问题讨论】:

  • 你能发布你的表格的 HTML 吗?
  • @Jeemusu 问题已编辑

标签: jquery json html-table


【解决方案1】:

有一个库可以将表格转换为 json 格式: 链接:https://github.com/lightswitch05/table-to-json

【讨论】:

  • 这是一个很棒的工具! (我可能有偏见,因为我是作者)。但是从&lt;input&gt; 字段中获取值时,它并没有那么好用。它对于提取纯文本更有用。虽然修改以使用&lt;input&gt; 字段并不难......
【解决方案2】:

试试这个

$('table.dynatable tr').each(function(){
    rows.push({
        Id: $(this).find('td:eq(1) input').val(),
        Name: $(this).find('td:eq(2) input').val(),
        Address: $(this).find('td:eq(3) input').val(),
        Contact: $(this).find('td:eq(4) input').val()
    });
});

DEMO

【讨论】:

  • 我的列也是动态的,所以不能硬编码 Id、Name、Address、Contact..我必须在 $('table.dynatable tr').each(function(){} 循环中为各个 td 从 th 找到列名..
【解决方案3】:

基本解决方案 - Demo

因为您使用的是实际输入字段,所以您真正需要做的就是将其包装在一个表单中。将其作为表单后,您可以使用 jQuery 选择它并调用 serializeArray() 来创建输入的名称-值数组。

var table = $('#my_form').serializeArray();
console.log(table);
alert(JSON.stringify(table)); 

结果不会 100% 像你想要的那样。如您所见,所有输入都是按顺序排列的,但没有一种真正可靠的方法来了解行之间的差异。另外,我不认为订单是有保证的。

[{"name":"id[]","value":"1"},
 {"name":"name[]","value":"Billy"},
 {"name":"col4[]","value":"Home"},
 {"name":"col3[]","value":"Phone"},
 {"name":"id[]","value":"2"},
 {"name":"name[]","value":"Bob"},
 {"name":"col4[]","value":"work"},
 {"name":"col3[]","value":"Cell"}]

维护行分组 - Demo

如果您编辑您的 &lt;input name="something[]"&gt; 命名数组以获取行号,那么您将能够知道哪些值属于一起。例如,如果您有两行,则输入名称将如下所示:

<tr class="prototype">
    <td><input type="text" name="id[0]" value="1" class="id" /></td>
     <td><input type="text" name="name[0]" value="Billy" /></td>
     <td><input type="text" name="col4[0]" value="Home" /></td>
     <td><input type="text" name="col3[0]" value="Phone" /></td>
 </tr>
 <tr class="prototype">
     <td><input type="text" name="id[1]" value="2" class="id" /></td>
     <td><input type="text" name="name[1]" value="Bob" /></td>
     <td><input type="text" name="col4[1]" value="work" /></td>
     <td><input type="text" name="col3[1]" value="Cell" /></td>
 </tr>

(注意名称数组中包含行号),返回结果如下所示:

[{"name":"id[0]","value":"1"},
 {"name":"name[0]","value":"Billy"},
 {"name":"col4[0]","value":"Home"},
 {"name":"col3[0]","value":"Phone"},
 {"name":"id[1]","value":"2"},
 {"name":"name[1]","value":"Bob"},
 {"name":"col4[1]","value":"work"},
 {"name":"col3[1]","value":"Cell"}]

按摩结果到所需的输出 - Demo

显然,结果仍然与您要查找的内容不匹配,但这也可以修复。我们知道了字段的名称,我们知道了字段的值,现在我们也知道了它的行号。使用一些正则表达式,我们可以将名称与行号分开。使用循环,我们可以将内容移动到我们喜欢的格式:

var table = $('#my_form').serializeArray();
var final_results = [];
var row_patt = /\[(\d+)\]$/; // Gets the row number inside []
var name_patt = /^[^\[]+/; // Gets the name without the [0]
$(table).each( function(index, ele){
    // Get the name of input and row number
    var rowNum = parseInt(row_patt.exec(ele.name)[1]);
    var name = name_patt.exec(ele.name);

    // Add the name and value to the correct spot in results
    if( final_results[rowNum] === undefined ){
        final_results[rowNum] = {};
    }
    final_results[rowNum][name] = ele.value;
});

现在我们有了一个格式良好的哈希数组,每行列出每个值:

[{"id":"1","name":"Billy","col4":"Home","col3":"Phone"},
 {"id":"2","name":"Bob",  "col4":"work","col3":"Cell"}]

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2021-09-06
    • 2017-09-17
    • 2020-05-27
    • 2021-04-14
    • 2014-09-01
    • 2013-11-14
    • 2014-08-02
    相关资源
    最近更新 更多