【问题标题】:Create table using Javascript from JSON [duplicate]使用来自 JSON 的 Javascript 创建表 [重复]
【发布时间】:2014-11-21 17:33:15
【问题描述】:

我试图在表格中显示的对象中有数据。不幸的是,我所有的专栏都显示undefined

  var fifadata = [{
    "fields": ["id", "country", "alternate_name", "fifa_code", "group_id", "group_letter", "wins", "draws", "losses", "games_played", "points", "goals_for", "goals_against", "goal_differential"]
  }, {
    "id": 1,
    "country": "Brazil",
    "alternate_name": null,
    "fifa_code": "BRA",
    "group_id": 1,
    "group_letter": "A",
    "wins": 4,
    "draws": 1,
    "losses": 2,
    "games_played": 7,
    "points": 13,
    "goals_for": 11,
    "goals_against": 14,
    "goal_differential": -3
  }, {
    "id": 2,
    "country": "Croatia",
    "alternate_name": null,
    "fifa_code": "CRO",
    "group_id": 1,
    "group_letter": "A",
    "wins": 1,
    "draws": 0,
    "losses": 2,
    "games_played": 3,
    "points": 3,
    "goals_for": 6,
    "goals_against": 6,
    "goal_differential": 0
  }, {
    "id": 3,
    "country": "Mexico",
    "alternate_name": null,
    "fifa_code": "MEX",
    "group_id": 1,
    "group_letter": "A",
    "wins": 2,
    "draws": 1,
    "losses": 1,
    "games_played": 4,
    "points": 7,
    "goals_for": 5,
    "goals_against": 3,
    "goal_differential": 2
  }];
var body = document.getElementsByTagName('body')[0];
var table = document.createElement("table");
var thead = document.createElement("thead");
var tbody = document.createElement("tbody");
var th = document.createElement("th");
var caption = document.createElement('caption');
var cap = document.createTextNode("Game Results List");
caption.appendChild(cap);
caption.style.fontWeight = "900";
table.appendChild(caption);
body.appendChild(table);
table.style.border = "1px dashed red";
table.style.borderSpacing = "1px";
table.style.textAlign = "center";

//table head(correct)

for (i = 0; i < 1; i++) {
  var tr = document.createElement("tr");
  thead.appendChild(tr);
  table.appendChild(thead);
  for (j = 0; j < fifadata[0].fields.length; j++) {
    var th = document.createElement("th");
    var keyname = fifadata[0].fields[j];
    var tm = document.createTextNode(keyname);
    th.appendChild(tm);
    tr.appendChild(th);
    th.style.border = "1px dashed blue";
    th.style.padding = "5px";
  }
}

//table body(incorrect).
//I need to use a dynamically created property(i.e. keyinfo) in "var text"
//i.e.fifadata[i].keyinfo; should change into fifadata[1].ID when it is 
//excecuted.

for (i = 1; i < fifadata.length; i++) {
  var tr = document.createElement("tr");
  tbody.appendChild(tr);
  table.appendChild(tbody);
  for (j = 0; j < fifadata[0].fields.length; j++) {
    var td = document.createElement("td");
    var keyinfo = fifadata[0].fields[j];
    var test = fifadata[i].keyinfo;
    var tn = document.createTextNode(test);
    td.appendChild(tn);
    tr.appendChild(td);
    td.style.border = "1px dashed green";
    td.style.padding = "2px";
  }
}

如果一切顺利,它应该从 JSON 数据创建一个表。可以稍微修改我的代码吗?有没有更简单的为什么要这样做?

【问题讨论】:

  • 我只需要使用 javascript 而不是 jquery 来完成此操作
  • 在所有代码中,您遇到了一个简单的问题。 var test=fifadata[i].keyinfo; 应该是 var test=fifadata[i][keyinfo]; 如果您将代码示例减少到给您带来麻烦的特定部分,这将很有帮助。通过解释它显示undefined,您几乎确定了该问题,因此如果人们不必深入研究该代码来获取分配所需文本的部分,这将很有帮助。
  • 谢谢。将接受未来问题的建议

标签: javascript arrays json javascript-objects


【解决方案1】:

您不能在dot notation 中使用类似的变量。您实际上是在请求一个名为 keyinfo 的属性,但它并不存在。

var keyinfo = fifadata[0].fields[j];
var test = fifadata[i].keyinfo; // wrong

要访问名称为 keyinfo 的 value 的属性,您需要使用 bracket notation,如下所示:

var keyinfo = fifadata[0].fields[j];
var test = fifadata[i][keyinfo]; // right

看看这个简化的演示:

(function() {

  // loading data from a hidden input to declutter the demo script
  var fifadata = JSON.parse(document.getElementById("fifadata").value);

  var table = document.createElement("table");

  var thead = table.appendChild(document.createElement("thead"));

  var tbody = table.appendChild(document.createElement("tbody"));

  var row = thead.insertRow(-1);

  // remove the first item in fifadata and get a reference to its fields property
  var fieldNames = fifadata.shift().fields;

  // create column headers
  fieldNames.forEach(function(fieldName) {
    row.appendChild(document.createElement("th")).textContent = fieldName;
  });

  // populate tbody rows
  fifadata.forEach(function(record) {
    row = tbody.insertRow(-1);
    fieldNames.forEach(function(fieldName) {
      // note that we use bracket notation to access the property
      row.insertCell(-1).textContent = record[fieldName];
    });
  });

  // add the table to the body once fully constructed
  document.body.appendChild(table);

})();
&lt;input type="hidden" id="fifadata" value='[{"fields":["id","country","alternate_name","fifa_code","group_id","group_letter","wins","draws","losses","games_played","points","goals_for","goals_against","goal_differential"]},{"id":1,"country":"Brazil","alternate_name":null,"fifa_code":"BRA","group_id":1,"group_letter":"A","wins":4,"draws":1,"losses":2,"games_played":7,"points":13,"goals_for":11,"goals_against":14,"goal_differential":-3},{"id":2,"country":"Croatia","alternate_name":null,"fifa_code":"CRO","group_id":1,"group_letter":"A","wins":1,"draws":0,"losses":2,"games_played":3,"points":3,"goals_for":6,"goals_against":6,"goal_differential":0},{"id":3,"country":"Mexico","alternate_name":null,"fifa_code":"MEX","group_id":1,"group_letter":"A","wins":2,"draws":1,"losses":1,"games_played":4,"points":7,"goals_for":5,"goals_against":3,"goal_differential":2}]'/&gt;

另请参阅:Property AccessorsArray.prototype.@987654324@Array.prototype.@987654325@HTMLTableElement.@987654326@HTMLTableRowElement.@987654327@Node.@987654328@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多