【问题标题】:Need JS to generate table html from JSON需要 JS 从 JSON 生成表格 html
【发布时间】:2015-12-11 18:22:26
【问题描述】:

我正在寻找一种 javascript 解决方案来从数据结构生成 HTML 表(或引导网格布局)。

[
    {"x":0,"y":0,"width":2,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":0,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":2,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":2,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":3,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":3,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":4,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":5,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":5,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":6,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":6,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":8,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":9,"width":3,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":10,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":10,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":10,"width":1,"height":5,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":11,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":11,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":12,"width":2,"height":2,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":14,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":14,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":15,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":16,"width":3,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"}
]

请注意,“height”和“width”分别代表rowspancolspan。 p>

谢谢

已编辑

到目前为止,我的解决方案是实施引导网格。不幸的是,它没有考虑 rowspan,因此会产生很多空白。

这里是代码

var cell_height = 80;
var $grid = $('<div class="grid"></div>');
var grid_width = 12;
var items = []; //items

var _getBootstrapGridWidth: function(width){
    return Math.round(12/grid_width*width);
};

var _createRow = function(){
    var $row = $('<div class="row grid-row"></div>');
    $row.css('min-height',cell_height);
    return $row;
};

var _fillInEmptyRows = function(current_y,next_y){
    var count = next_y-current_y;
    (count) && (count--); //needs to subtract 1 to adjust
    while (count--){
        $grid.append(_createRow());
    }
};

//lets create the layout
_.each(items,function(item){

    // If y suggests we're on a new row (including the first item), create a new row
    if (item.y!==current.y){
        $row = _createRow();
        _fillInEmptyRows(current.y,item.y);
        $grid.append($row);
        current.y = item.y;
        current.x = 0;
    }

    var $column = $('<div class="grid-item-wrapper"></div>');

    //lets add the data attr
    $column.attr('data-x',item.x).attr('data-y',item.y).attr('data-width',item.width).attr('data-height',item.height);

    //add width class
    $column.addClass('col-sm-'+_getBootstrapGridWidth(item.width));

    //if x is not the same as our current x position, add offset class
    if (item_data.x!==current.x)
        $column.addClass('col-sm-offset-'+_getBootstrapGridWidth(item_data.x-current.x));

    //set height of new div
    $column.css('min-height',cell_height);

    //increment current.x to new starting position
    current.x += (item.x-current.x)+item.width;

    //add the div to the current row
    $column.append($item);
    $row.append($column);
});

【问题讨论】:

  • 你写了什么代码来解决这个问题?
  • 首先,根据该数据手动编写 HTML。然后尝试编写遵循您手动遵循的相同逻辑的 JS。然后你可能会遇到一些特定的编程问题,你会在 stackoverflow 上寻求帮助。
  • 数据取自生成布局的 gridstack.js 库。必须考虑 Rowspans 和 Colspans。上面的链接没有解决问题
  • @DanielA.White 我已经添加了到目前为止的代码。

标签: javascript html json gridview grid


【解决方案1】:

您可以简单地遍历 json 数组中的项目并构建您想要的任何标记。使用$.each 遍历数组中的项目。

 var data =[
             {"x":0,"y":0,"width":2,"height":1,"title":"Lorem ipsum dolor sitamet"},
             {"x":2,"y":0,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"}      

           ];



var tbl="<table>";

 $.each(data,function(index,item){

     tbl+="<tr><td rowspan='"+item.height+"' colspan='"+item.width+"'>"
                                                             +item.title+"</td></tr>";

  });

  tbl+="</table>";

 $("#tblContainer").html(tbl);

假设tblContainer 是您要在其中显示此表格的页面中的容器 div 的 ID。

Here 是一个示例

【讨论】:

  • 在您的代码中,您似乎在每个 TR 中放置了一项。这不是需要做的。请再次阅读要求。
  • 答案应该会给您一个想法,以帮助您自己编写解决方案。玩它,你会得到它。
  • 请注意,我要求的是解决方案,而不是为我指明正确方向的想法。我只有在撞墙时才伸出手。
【解决方案2】:

请检查这是否解决了您的问题

var tblData = [
    {"x":0,"y":0,"width":2,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":0,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":2,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":2,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":3,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":3,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":4,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":5,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":5,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":6,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":6,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":8,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":9,"width":3,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":10,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":10,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":10,"width":1,"height":5,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":11,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":11,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":12,"width":2,"height":2,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":14,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":14,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":15,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":16,"width":3,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":0,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":1,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
    {"x":2,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"}
];


// Add your javascript here
$(function(){

  var tableTag = "<table border='1'>";
  for(i = 0;i<tblData.length;i++){
      //tableTag+="<tr><td>"+tblData[i].x+"</td><td>"+tblData[i].y+"<td colspan="+tblData[i].width+" rowspan="+tblData[i].height+">"+tblData[i].title+"</td></tr>";
      tableTag+="<tr><td colspan="+tblData[i].width+" rowspan="+tblData[i].height+">"+tblData[i].title+"</td></tr>";
  }

$("#tblid").html(tableTag);
});

http://plnkr.co/edit/YpljIJ6WaX8QOPc2fPPs?p=preview

【讨论】:

  • 不,不完全是。如果您查看前两项,您会发现它们都在同一行,但第一项的 width 2 转换为 colspan .
  • 基本上 xy 代表项目在 12 上的位置- 列网格。因此,当 y 相同时,表示项目在同一行。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2020-08-15
  • 2014-06-29
  • 2015-12-17
  • 2012-10-06
相关资源
最近更新 更多