【问题标题】:Converting Html Table to JSON将 Html 表转换为 JSON
【发布时间】:2014-02-23 00:40:28
【问题描述】:

我创建了一个将 html 表转换为 JSON 的示例应用程序。问题是 JSON 没有重复值,我也想从 JSON 中删除最后两列。

我生成的 JSON 如下所示

[
   {
      "Person Name":"Smith",
      "Score":"disqualified",
      "Price":"150",
      "Tax":"41"
   },
   {
      "Person Name":"Jackson",
      "Score":"94",
      "Price":"250",
      "Tax":"81"
   },
   {
      "Person Name":"Doe",
      "Score":"80",
      "Price":"950",
      "Tax":"412"
   },
   {
      "Person Name":"Johnson",
      "Score":"67",
      "Price":"750",
      "Tax":"941"
   }
]

但我预期的 JSON 是这样的

[
   {
      "Person Name":"Jill",
      "Person Name":"Smith",
      "Score":"disqualified"
   },
   {
      "Person Name":"Eve",
      "Person Name":"Smith",
      "Score":"94"
   },
   {
      "Person Name":"John",
      "Person Name":"Smith",
      "Score":"80"
   },
   {
      "Person Name":"Adam",
      "Person Name":"Smith",
      "Score":"67"
   }
]

谁能告诉我如何从表中生成上述 JSON

我的代码如下所示。

html代码

<table id='example-table'>
    <thead>
    <tr>
        <th>Person Name</th>
        <th>Person Name</th>
        <th data-override="Score">Points</th>
        <th>Price</th>
        <th>Tax</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>Jill</td>
        <td>Smith</td>
        <td data-override="disqualified">50</td>
        <td>150</td>
        <td>41</td>
    </tr>
    <tr>
        <td>Eve</td>
        <td>Jackson</td>
        <td>94</td>
        <td>250</td>
        <td>81</td>
    </tr>
    <tr>
        <td>John</td>
        <td>Doe</td>
        <td>80</td>
        <td>950</td>
        <td>412</td>
    </tr>
    <tr>
        <td>Adam</td>
        <td>Johnson</td>
        <td>67</td>
        <td>750</td>
        <td>941</td>
    </tr>
    </tbody>
</table>
<button id="convert-table" >Convert!</button>

javascript 代码

$('#convert-table').click( function() {
  var table = $('#example-table').tableToJSON();
  console.log(table);
  alert(JSON.stringify(table));  
});

DEMO (JSFiddle)

【问题讨论】:

标签: javascript jquery json


【解决方案1】:

从行格式化html-data。

$("#del_player").on("click", function() {
    var row_to_del = $("#table_player tbody tr[active=true]");
    var arr = [];

    $.each(row_to_del, function(key, val){
        arr.push(val.outerText.split('\t'));
    });
    console.log(JSON.stringify(arr));
})

【讨论】:

    【解决方案2】:

    您不能有重复的键,但您可以使用名称数组来代替。示例:

    {
      "PersonNames":["John","Smith"],
      "Score":"80"
    },
    

    【讨论】:

      【解决方案3】:

      类似的东西会起作用(不是很好,但是)

      解释:

      您可以使用 ignoreColumns 来避免使用第 3 列和第 4 列。

      您可以使用标题来更改“标题”(json 文件中的键)。但这也将占用第一行(带有 TH 的行)。

      所以我们必须在构建 json 数组后删除第一行。

      $('#convert-table').click( function() {
          var $table = $('#example-table');
      
          var table = $table.tableToJSON(
                            {
                               ignoreColumns:[3, 4], 
                               headings: ['FirstName', 'LastName', 'Score']
                             });
          var newTable = $.map(table, function(e){
              return (e.FirstName == "Person Name") ? null : e;
          });
          console.log(newTable);
          alert(JSON.stringify(newTable));  
      });
      

      jsfiddle

      编辑

      如果 Person Name 的列数是动态的,您可以这样做(假设您从不想要最后两行)

      function convertToTable(el, numberOfColumns, columnNames) {
          var columnsToIgnore = [numberOfColumns-2, numberOfColumns-1];
          var table = el.tableToJSON(
              {
                  ignoreColumns:columnsToIgnore, 
                  headings: columnNames
              });
          var result = $.map(table, function(e){
              return (e['Person Name0'] == "Person Name") ? null : e;
          });
          alert(JSON.stringify(result));
      }
      
      $('#convert-table').click( function() {
          var $table = $('#example-table');
          var columns = $table.find('th');
          var numberOfColumns = columns.length;    
          var columnNames = columns.map(function(index) {
              var text = $(this).text();
              return text == 'Person Name' ? text + index : text;
          }).get();
      
        convertToTable($table, numberOfColumns, columnNames); 
      });
      

      JsFiddle

      【讨论】:

      • 问题是Person Name列是动态的,可以是两个或更多
      • @user3253853 而不是您必须构建自己的函数,该函数将使用正确的参数调用 tableToJSON。
      • @user3253853 顺便说一下,你能展示一些可能存在的“不同情况”吗?
      【解决方案4】:

      试试这个:

      $('#convert-table').click( function() {
      var table = $('#example-table').tableToJSON({
          ignoreColumns:[3,4]}
      );
       console.log(table);
       alert(JSON.stringify(table));  
      });
      

      Jsfiddle:http://jsfiddle.net/robertrozas/9VX6Z/

      【讨论】:

      • 不是First Name Last Name,应该是Person Name
      【解决方案5】:

      要删除最后两个字段,请使用“ignoreColumns”选项

      var table = $('#example-table').tableToJSON({
          ignoreColumns:[2,3]
      });
      

      并使标题独一无二

      <th>Person Name</th>
      <th>Person SurName</th>
      

      【讨论】:

      • 谢谢.....这可以删除最后两列......但是如何生成具有不同值的重复键(人名)的 JSON
      • 我不认为这个模块打算这样做。如果你能找到任何允许的话,你需要使用另一个允许它的模块。
      • tableToJSON 是一个 jquery 模块。无论如何,为什么您需要如此严重地重复列名?也许这个限制可以通过其他方式解除?
      猜你喜欢
      • 2013-09-03
      • 2015-09-02
      • 2013-07-02
      • 2021-07-05
      • 2020-05-09
      • 2019-06-13
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多