【问题标题】:Creating html table from JSON data从 JSON 数据创建 html 表
【发布时间】:2019-09-18 18:53:38
【问题描述】:

我有一个包含这个 sn-p 的 html 文件。

<div>
    <table id="apps"></table>
</div>

我收到如下所示的 JSON 数据:

{
    "1": [
        {
            "A": "",
            "B": "",
            "C": "",
            "D": "",
            "E": ""
        }
    ]
}

将只有一个 "1" ,但"1" 列表中可以有多个字典。在此示例中,列表中只有一个 {} [] ,但可以存在多个 {} ,它们恰好包含五个项目,如上所示。

我想根据这些数据创建一个表,其中每一行代表[] 中的一个{},并有五列分别代表A、B、C、D、E。

我不确定我是否应该有这个结构,我的 html 中已经存在的标签(这不在我提供的 html 代码中),然后填充这些标签,或者我的函数是否应该在我的 html 文件中加载这些数据,访问表 id="apps" 并创建这些标签,然后填充这些标签?哪个更好?以及如何有效地做到这一点?

【问题讨论】:

  • 如果这不是家庭作业,我强烈推荐 jQuery DataTables,因为它在将 JSON 数据转换为表格方面做得非常出色。

标签: javascript jquery html json


【解决方案1】:

试试这个简单的工作示例。我希望它会按照您的期望工作。

var dataObj = {
    "1": [{
            "A": "",
            "B": "",
            "C": "",
            "D": "",
            "E": ""
        },
        {
            "F": "",
            "G": "",
            "H": "",
            "I": "",
            "J": ""
        },
        {
            "K": "",
            "L": "",
            "M": "",
            "N": "",
            "O": ""
        }
    ]};

var dictionaryData = dataObj["1"];

for (var i in dictionaryData) {
  var table = document.getElementById("apps");
  var tr = document.createElement("tr");
  var td = document.createElement("td");
  
  for (var key in dictionaryData[i]) {
    var txt = document.createTextNode(key);
    td.appendChild(txt);
    tr.appendChild(td);
  }
  table.appendChild(tr);
}
table, td {
    border: 1px solid black;
}
<div>
    <table id="apps"></table>
</div>

【讨论】:

  • 您需要修复您的代码,现在它只为每个 TR 创建一个 TD。
【解决方案2】:

不知道您对该项目的要求,但我会跳过所有这些麻烦并使用像 DataTables 这样的库。有很多方法可以从 AJAX 或其他 data sources 填充表。即使您无法修改表数据源以符合其标准,也可以使用 method 重新格式化。

【讨论】:

    【解决方案3】:

    您的问题是“哪个更好:在标记中已有表格行和单元格标签,还是在我获取数据时构建它们?”

    我会说更好的选择是在获取对象时构建数据。

    在伪代码中:

    for each object in 1
      make new row <tr></tr>
    
      for each data in object
        make new cell <td></td>
        insert data into <td>[here]</td>
        insert cell into <tr>[here]</tr>
    
      insert filled row into "apps" by using it's ID
    done
    

    这足以满足您想了解的内容吗?

    【讨论】:

      【解决方案4】:

      查看此演示:

      var jsonResponse = {
          "1": [{
                  "A": "",
                  "B": "",
                  "C": "",
                  "D": "",
                  "E": ""
              },
              {
                  "F": "",
                  "G": "",
                  "H": "",
                  "I": "",
                  "J": ""
              }
          ],
          "2": [{
                  "K": "",
                  "L": "",
                  "M": "",
                  "N": "",
                  "O": ""
              },
              {
                  "P": "",
                  "Q": "",
                  "R": "",
                  "S": "",
                  "T": ""
              }
          ]
      };
      
      $.each(jsonResponse, function(outerKey, list) {
          var row = $('<tr>', {
              id: 'row_' + outerKey
          });
          $.each(list, function(innerKey, value) {
              for (var key in value) {
                  var col = $('<td>', {
                      id: key,
                      text: key
                  })
                  row.append(col);
              }
          });
          $('#apps').append(row);
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <div>
          <table id="apps"></table>
      </div>

      【讨论】:

        【解决方案5】:
        CREATE PROC SearchAllTables 
        (
            @SearchStr nvarchar(100)
        )
        AS
        BEGIN
        
            CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
        
            SET NOCOUNT ON
        
            DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
            SET  @TableName = ''
            SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
        
            WHILE @TableName IS NOT NULL
            BEGIN
                SET @ColumnName = ''
                SET @TableName = 
                (
                    SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                    FROM    INFORMATION_SCHEMA.TABLES
                    WHERE       TABLE_TYPE = 'BASE TABLE'
                        AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                        AND OBJECTPROPERTY(
                                OBJECT_ID(
                                    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                     ), 'IsMSShipped'
                                       ) = 0
                )
        
                WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
                BEGIN
                    SET @ColumnName =
                    (
                        SELECT MIN(QUOTENAME(COLUMN_NAME))
                        FROM    INFORMATION_SCHEMA.COLUMNS
                        WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                            AND TABLE_NAME  = PARSENAME(@TableName, 1)
                            AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
                            AND QUOTENAME(COLUMN_NAME) > @ColumnName
                    )
        
                    IF @ColumnName IS NOT NULL
                    BEGIN
                        INSERT INTO #Results
                        EXEC
                        (
                            'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                            FROM ' + @TableName + ' (NOLOCK) ' +
                            ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                        )
                    END
                END 
            END
        
            SELECT ColumnName, ColumnValue FROM #Results
         END
        
        
        exec SearchAllTables @SearchStr='Canada'
        

        【讨论】:

        • 请查看您的答案并进行编辑,以使代码格式正确。我会自己编辑,但不知道哪些位属于哪里。
        猜你喜欢
        • 2014-08-02
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 2012-04-22
        相关资源
        最近更新 更多