【问题标题】:JavaScript: Building a HTML table from a nested JSONJavaScript:从嵌套的 JSON 构建 HTML 表
【发布时间】:2011-04-25 22:24:25
【问题描述】:

我在从以下 JSON 构建 HTML 表时遇到问题

[ 
  { 
    "size" : 167, 
    "price" : 453400, 
    "type" : "Neubau", 
    "children" : false
  }, 
  { 
    "size" : 167, 
    "price" : 453400, 
    "type" : "Neubau", 
    "children" : false
  }, 
  { 
    "size" : 167, 
    "price" : 453400, 
    "type" : "Neubau", 
    "children":[
      { 
        "size" : 167, 
        "price" : 453400, 
        "type" : "Neubau", 
        "children" : false
      },
      { 
        "size" : 167, 
        "price" : 453400, 
        "type" : "Neubau",
        "children" : false
      }  
    ]
  }, 
  { 
    "size" : 167, 
    "price" : 453400, 
    "type" : "Neubau", 
    "children" : false
  }
]

当输入这些函数时

function getRowHTML(dataObject, type) {
  cycles = dataObject.length;
  var markup = '';
  for (var i=0; i < cycles; i++) {
    // different markup for each line
    switch (type) {
      case 'size':
        markup += ' <td>' + dataObject[i].size + '</td>';
        break;
      case 'price':
        markup += ' <td>' + addDots(dataObject[i].price) + '&euro; </td>';
        break;
      case 'type':
        markup += ' <td>' + dataObject[i].type + '</td>';
        break; 
    }

    // Check if an object has children and insert children HTML as well
    if (dataObject[i].children) {
      markup += getRowHTML(dataObject[i].children,type);
    }
  }
  return markup;
}

function getHTML(data) {
  var markup = '<table>';

  markup += '<tr class="odd">' + getRowHTML(data,'size') + '</tr>';
  markup += '<tr class="even">' + getRowHTML(data,'price') + '</tr>';
  markup += '<tr class="odd">' + getRowHTML(data,'type') + '</tr>';


  markup += '</table>';

  return markup;
}

在我添加对子项的检查和相应的递归函数调用之前,一切正常。

那么结果是前两个对象和子对象,但最后一个不会在表中。有什么想法吗?

【问题讨论】:

    标签: javascript json recursion


    【解决方案1】:

    您忘记了cycles 变量上的var,使其意外成为全局变量。对getRowHTML 的内部调用会覆盖外部调用中全局cycles 的值,从而使外部循环提前结束。

    请注意,如果任何属性可以包含 HTML 特殊字符,您也会遇到 HTML 注入问题。您应该对任何插入 HTML 字符串的内容进行 HTML 转义。或者,为了避免考虑这一点,请使用 DOM 方法来创建表。例如。

    function fillRow(row, items, property) {
        for (var i= 0, n= items.length; i<n; i++) {
            var item= items[i];
            var s= item[property];
            if (property==='price')
                s= addDots(s)+'\u20Ac'; // €
            row.insertCell(-1).appendChild(document.createTextNode(s));
            if (item.children)
                fillRow(row, item.children, property);
        }
    }
    
    function makeTable(data) {
        var table= document.createElement('table');
        var properties= ['size', 'price', 'type'];
        for (var i= 0, n= properties.length; i<n; i++) {
            var row= table.insertRow(-1);
            row.className= i%2===0? 'odd' : 'even';
            fillRow(row, data, properties[i]);
        }
        return table;
    }
    

    【讨论】:

    • 谢谢,我错过了全球。实际代码要复杂得多,并且 JSON 将来自安全源。但也感谢您的提示。
    • 比我破解的要好得多。我宁愿翻转 X 和 Y 数据,但对于我现在需要的,这是完美的。
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2022-08-18
    • 2010-11-15
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多