Chuyển đổi mảng JSON thành bảng HTML trong jQuery


80

Có cách nào thực sự dễ dàng để tôi có thể lấy một mảng các đối tượng JSON và biến nó thành một bảng HTML, ngoại trừ một số trường không? Hay tôi sẽ phải làm điều này theo cách thủ công?

Câu trả lời:


37

Tôi không chắc đây có phải là điều bạn muốn hay không nhưng có jqGrid . Nó có thể nhận JSON và tạo lưới.


Một phiếu bầu khác cho jqGrid - thực sự dễ thực hiện, có tài liệu và ví dụ tuyệt vời, đồng thời cắt giảm rất nhiều công việc cho bạn.
Peter Bailey

jqGrid trông rất hứa hẹn!
Charlie Vieillard

3
Lưu ý rằng jqGrid là một sản phẩm thương mại với chi phí cấp phép không hề nhỏ.
simpleuser

83

Sử dụng jQuery sẽ giúp việc này đơn giản hơn.

Đoạn mã sau sẽ lấy một mảng mảng và lưu trữ chuyển đổi chúng thành hàng và ô.

$.getJSON(url , function(data) {
    var tbl_body = "";
    var odd_even = false;
    $.each(data, function() {
        var tbl_row = "";
        $.each(this, function(k , v) {
            tbl_row += "<td>"+v+"</td>";
        });
        tbl_body += "<tr class=\""+( odd_even ? "odd" : "even")+"\">"+tbl_row+"</tr>";
        odd_even = !odd_even;               
    });
    $("#target_table_id tbody").html(tbl_body);
});

Bạn có thể thêm séc cho các khóa bạn muốn loại trừ bằng cách thêm một số thứ như

var expected_keys = { key_1 : true, key_2 : true, key_3 : false, key_4 : true };

khi bắt đầu hàm gọi lại getJSON và thêm:

if ( ( k in expected_keys ) && expected_keys[k] ) {
...
}

xung quanh dòng tbl_row + =.

Chỉnh sửa: Đã chỉ định một biến null trước đây

Chỉnh sửa: Phiên bản dựa trên đóng góp miễn phí của Timmmm .

$.getJSON(url , function(data) {
    var tbl_body = document.createElement("tbody");
    var odd_even = false;
    $.each(data, function() {
        var tbl_row = tbl_body.insertRow();
        tbl_row.className = odd_even ? "odd" : "even";
        $.each(this, function(k , v) {
            var cell = tbl_row.insertCell();
            cell.appendChild(document.createTextNode(v.toString()));
        });        
        odd_even = !odd_even;               
    });
    $("#target_table_id").append(tbl_body);   //DOM table doesn't have .appendChild
});

Tôi đang gặp khó khăn trong việc kiểm soát thứ tự của các cột
Nathan H

Chỉ nhìn thấy điều này. Tôi sẽ viết nó như thế nào để <tr>xen kẽ giữa việc có một lớp chẵn hoặc lẻ?
Monica

Thứ tự của các cột sẽ phụ thuộc vào thứ tự chúng xuất hiện trong dữ liệu nguồn. Tôi đã thêm một máy phát điện lẻ / chẵn đơn giản vào OP.
avatastic

5
Lưu ý rằng điều này rất dễ bị chèn tập lệnh. Tức là không sử dụng nó với nội dung do người dùng tạo.
Timmmm

7
Bạn nên sử dụng $ ("# target_table_id"). Append (tbl_body); thay vì $ ("# target_table_id"). appendChild (tbl_body); vì đối tượng jQuery chỉ hiển thị một hàm nối thêm.
BornToCode

15

Tạo Bảng HTML từ một mảng Đối tượng JSON bằng cách mở rộng $ như hình dưới đây

$.makeTable = function (mydata) {
    var table = $('<table border=1>');
    var tblHeader = "<tr>";
    for (var k in mydata[0]) tblHeader += "<th>" + k + "</th>";
    tblHeader += "</tr>";
    $(tblHeader).appendTo(table);
    $.each(mydata, function (index, value) {
        var TableRow = "<tr>";
        $.each(value, function (key, val) {
            TableRow += "<td>" + val + "</td>";
        });
        TableRow += "</tr>";
        $(table).append(TableRow);
    });
    return ($(table));
};

và sử dụng như sau:

var mydata = eval(jdata);
var table = $.makeTable(mydata);
$(table).appendTo("#TableCont");

trong đó TableCont là một số div


9

Cách HTML thuần túy, không dễ bị tấn công như những cách khác AFAIK:

// Function to create a table as a child of el.
// data must be an array of arrays (outer array is rows).
function tableCreate(el, data)
{
    var tbl  = document.createElement("table");
    tbl.style.width  = "70%";

    for (var i = 0; i < data.length; ++i)
    {
        var tr = tbl.insertRow();
        for(var j = 0; j < data[i].length; ++j)
        {
            var td = tr.insertCell();
            td.appendChild(document.createTextNode(data[i][j].toString()));
        }
    }
    el.appendChild(tbl);
}

Ví dụ sử dụng:

$.post("/whatever", { somedata: "test" }, null, "json")
.done(function(data) {
    rows = [];
    for (var i = 0; i < data.Results.length; ++i)
    {
        cells = [];
        cells.push(data.Results[i].A);
        cells.push(data.Results[i].B);
        rows.push(cells);
    }
    tableCreate($("#results")[0], rows);
});

7

Chuyển đổi mảng JavaScript 2D sang bảng HTML

Để biến một mảng JavaScript 2D thành một bảng HTML, bạn thực sự cần nhưng một chút mã:

function arrayToTable(tableData) {
    var table = $('<table></table>');
    $(tableData).each(function (i, rowData) {
        var row = $('<tr></tr>');
        $(rowData).each(function (j, cellData) {
            row.append($('<td>'+cellData+'</td>'));
        });
        table.append(row);
    });
    return table;
}

$('body').append(arrayToTable([
    ["John","Slegers",34],
    ["Tom","Stevens",25],
    ["An","Davies",28],
    ["Miet","Hansen",42],
    ["Eli","Morris",18]
]));
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>


Đang tải tệp JSON

Nếu bạn muốn tải mảng 2D của mình từ tệp JSON, bạn cũng sẽ cần một chút mã Ajax:

$.ajax({
    type: "GET",
    url: "data.json",
    dataType: 'json',
    success: function (data) {
        $('body').append(arrayToTable(data));
    }
});

5

Đối với các đối tượng JSON rất nâng cao cho bảng HTML, bạn có thể thử Giải pháp jQuery của tôi dựa trên chuỗi đóng này .

var myList=[{"name": "abc","age": 50},{"name": {"1": "piet","2": "jan","3": "klaas"},"age": "25","hobby": "watching tv"},{"name": "xyz","hobby": "programming","subtable": [{"a": "a","b": "b"},{"a": "a","b": "b"}]}];

// Builds the HTML Table out of myList json data from Ivy restful service.
 function buildHtmlTable() {
      addTable(myList, $("#excelDataTable"));
 }

function addTable(list, appendObj) {
    var columns = addAllColumnHeaders(list, appendObj);

    for (var i = 0; i < list.length; i++) {
        var row$ = $('<tr/>');
        for (var colIndex = 0; colIndex < columns.length; colIndex++) {
            var cellValue = list[i][columns[colIndex]];

            if (cellValue == null) {
                cellValue = "";
            }

            if (cellValue.constructor === Array)
            {
                $a = $('<td/>');
                row$.append($a);
                addTable(cellValue, $a);

            } else if (cellValue.constructor === Object)
            {

                var array = $.map(cellValue, function (value, index) {
                    return [value];
                });

                $a = $('<td/>');
                row$.append($a);
                addObject(array, $a);

            } else {
                row$.append($('<td/>').html(cellValue));
            }
        }
        appendObj.append(row$);
    }
}


function addObject(list, appendObj) {
    for (var i = 0; i < list.length; i++) {
        var row$ = $('<tr/>');

        var cellValue = list[i];

        if (cellValue == null) {
            cellValue = "";
        }

        if (cellValue.constructor === Array)
        {
            $a = $('<td/>');
            row$.append($a);
            addTable(cellValue, $a);

        } else if (cellValue.constructor === Object)
        {

            var array = $.map(cellValue, function (value, index) {
                return [value];
            });

            $a = $('<td/>');
            row$.append($a);
            addObject(array, $a);

        } else {
            row$.append($('<td/>').html(cellValue));
        }
        appendObj.append(row$);
    }
}

// Adds a header row to the table and returns the set of columns.
// Need to do union of keys from all records as some records may not contain
// all records
function addAllColumnHeaders(list, appendObj)
{
    var columnSet = [];
    var headerTr$ = $('<tr/>');

    for (var i = 0; i < list.length; i++) {
        var rowHash = list[i];
        for (var key in rowHash) {
            if ($.inArray(key, columnSet) == -1) {
                columnSet.push(key);
                headerTr$.append($('<th/>').html(key));
            }
        }
    }
    appendObj.append(headerTr$);

    return columnSet;
}

2

Bạn có thể sử dụng một plugin jQuery chấp nhận dữ liệu JSON để điền vào một bảng. jsonTable


2

Tôi đã tìm thấy một bản sao ở đây: Chuyển đổi dữ liệu json thành một bảng html

Chà, có rất nhiều plugin tồn tại, bao gồm cả plugin thương mại (Hãy biến nó thành dự án thương mại ?! Kinda đã quá hạn ... nhưng bạn có thể kiểm tra tại đây: https://github.com/alfajango/jquery-dynatable )

Cái này có nhiều nhánh hơn: https://github.com/afshinm/Json-to-HTML-Table

//Example data, Object 
var objectArray = [{
    "Total": "34",
    "Version": "1.0.4",
    "Office": "New York"
}, {
    "Total": "67",
    "Version": "1.1.0",
    "Office": "Paris"
}];

//Example data, Array
var stringArray = ["New York", "Berlin", "Paris", "Marrakech", "Moscow"];

//Example data, nested Object. This data will create nested table also.
var nestedTable = [{
    key1: "val1",
    key2: "val2",
    key3: {
        tableId: "tblIdNested1",
        tableClassName: "clsNested",
        linkText: "Download",
        data: [{
            subkey1: "subval1",
            subkey2: "subval2",
            subkey3: "subval3"
        }]
    }
}];

Áp dụng mã

//Only first parameter is required
var jsonHtmlTable = ConvertJsonToTable(objectArray, 'jsonTable', null, 'Download');

Hoặc bạn cũng có thể muốn kiểm tra plugin jQuery này: https://github.com/jongha/jquery-jsontotable

Tôi nghĩ các plugin của jongha dễ sử dụng hơn

<div id="jsontotable" class="jsontotable"></div>

var data = [[1, 2, 3], [1, 2, 3]];
$.jsontotable(data, { id: '#jsontotable', header: false });

2

Nếu bạn chấp nhận sử dụng một công cụ phụ thuộc jQuery khác , tôi khuyên bạn nên sử dụng Tabulator . Sau đó, bạn sẽ không cần phải viết HTML hoặc bất kỳ mã tạo DOM nào khác, trong khi vẫn duy trì tính linh hoạt cao liên quan đến việc định dạng và xử lý dữ liệu bảng.

nhập mô tả hình ảnh ở đây

Đối với một ví dụ làm việc khác bằng cách sử dụng Node , bạn có thể xem dự án demo MMM-Tabulator .


1

với jquery thuần túy:

window.jQuery.ajax({
    type: "POST",
    url: ajaxUrl,
    contentType: 'application/json',
    success: function (data) {

        var odd_even = false;
        var response = JSON.parse(data);

        var head = "<thead class='thead-inverse'><tr>";
        $.each(response[0], function (k, v) {
            head = head + "<th scope='row'>" + k.toString() + "</th>";
        })
        head = head + "</thead></tr>";
        $(table).append(head);//append header
       var body="<tbody><tr>";
        $.each(response, function () {
            body=body+"<tr>";
            $.each(this, function (k, v) {
                body=body +"<td>"+v.toString()+"</td>";                                        
            }) 
            body=body+"</tr>";               
        })
        body=body +"</tbody>";
        $(table).append(body);//append body
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert(xhr.responsetext);
    }
});

1

Bạn có thể làm điều này khá dễ dàng với Javascript + Jquery như bên dưới. Nếu bạn muốn loại trừ một số cột, chỉ cần viết câu lệnh if bên trong vòng lặp for để bỏ qua các cột đó. Hi vọng điêu nay co ich!

//Sample JSON 2D array
var json = [{
  "Total": "34",
  "Version": "1.0.4",
  "Office": "New York"
}, {
  "Total": "67",
  "Version": "1.1.0",
  "Office": "Paris"
}];

// Get Table headers and print
for (var k = 0; k < Object.keys(json[0]).length; k++) {
  $('#table_head').append('<td>' + Object.keys(json[0])[k] + '</td>');
}

// Get table body and print
for (var i = 0; i < Object.keys(json).length; i++) {
  $('#table_content').append('<tr>');
  for (var j = 0; j < Object.keys(json[0]).length; j++) {
    $('#table_content').append('<td>' + json[i][Object.keys(json[0])[j]] + '</td>');
  }
  $('#table_content').append('</tr>');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <tr id="table_head">

    </tr>
  </thead>
  <tbody id="table_content">

  </tbody>
</table>


1

Một cách đơn giản để làm điều này là:

var data = [{
  "Total": 34,
  "Version": "1.0.4",
  "Office": "New York"
}, {
  "Total": 67,
  "Version": "1.1.0",
  "Office": "Paris"
}];

drawTable(data);

function drawTable(data) {

  // Get Table headers and print
  var head = $("<tr />")
  $("#DataTable").append(head);
  for (var j = 0; j < Object.keys(data[0]).length; j++) {
    head.append($("<th>" + Object.keys(data[0])[j] + "</th>"));
  }

  // Print the content of rows in DataTable
  for (var i = 0; i < data.length; i++) {
    drawRow(data[i]);
  }

}

function drawRow(rowData) {
  var row = $("<tr />")
  $("#DataTable").append(row);
  row.append($("<td>" + rowData["Total"] + "</td>"));
  row.append($("<td>" + rowData["Version"] + "</td>"));
  row.append($("<td>" + rowData["Office"] + "</td>"));
}
table {
  border: 1px solid #666;
  width: 100%;
  text-align: center;
}

th {
  background: #f8f8f8;
  font-weight: bold;
  padding: 2px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="DataTable"></table>


0

Đã sửa đổi một đoạn mã bit của mã @ Dr.sai. Hy vọng điều này sẽ hữu ích.

(function ($) {
    /**
     * data - array of record
     * hidecolumns, array of fields to hide
     * usage : $("selector").generateTable(json, ['field1', 'field5']);
     */
    'use strict';
    $.fn.generateTable = function (data, hidecolumns) {
        if ($.isArray(data) === false) {
            console.log('Invalid Data');
            return;
        }
        var container = $(this),
            table = $('<table>'),
            tableHead = $('<thead>'),       
            tableBody = $('<tbody>'),       
            tblHeaderRow = $('<tr>');       

        $.each(data, function (index, value) {
            var tableRow = $('<tr>').addClass(index%2 === 0 ? 'even' : 'odd');      
            $.each(value, function (key, val) {
                if (index == 0 && $.inArray(key, hidecolumns) <= -1 ) { 
                    var theaddata = $('<th>').text(key);
                    tblHeaderRow.append(theaddata); 
                }
                if ($.inArray(key, hidecolumns) <= -1 ) { 
                    var tbodydata = $('<td>').text(val);
                    tableRow.append(tbodydata);     
                }
            });
            $(tableBody).append(tableRow);  
        });
        $(tblHeaderRow).appendTo(tableHead);
        tableHead.appendTo(table);      
        tableBody.appendTo(table);
        $(this).append(table);    
        return this;
    };
})(jQuery);

Hy vọng điều này cũng sẽ hữu ích để ẩn một số cột. Liên kết đến tệp


0

Chế độ xem một hàng được xoay vòng với tiêu đề ở bên trái dựa trên câu trả lời của @ Dr.sai ở trên.

Phương thức .text của jQuery đã ngăn chặn quá trình tiêm

$.makeTable = function (mydata) {
    var table = $('<table>');
    $.each(mydata, function (index, value) {
        // console.log('index '+index+' value '+value);
        $(table).append($('<tr>'));
        $(table).append($('<th>').text(index));
        $(table).append($('<td>').text(value));
    });
    return ($(table));
};

-1

Một cách vẫn ngắn hơn

$.makeTable = function (mydata) {
            if (mydata.length <= 0) return "";
           return $('<table border=1>').append("<tr>" + $.map(mydata[0], function (val, key) {
                return "<th>" + key + "</th>";
            }).join("\n") + "</tr>").append($.map(mydata, function (index, value) {
                return "<tr>" + $.map(index, function (val, key) {
                    return "<td>" + val + "</td>";
                }).join("\n") + "</tr>";
            }).join("\n"));
        };

Dễ bị chèn HTML / script.
Timmmm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.