[英]Generating a table using nested jQuery from JSON
我正在嘗試從一些JSON數據生成一個表。
我想要得到的基本上是出版商列表,該出版商的每個作者以及每個作者的書籍詳細信息。 因此,使用下面的JSON看起來像:
Publisher | Author | BookDetails
-------------------------------------
Random House | John Smith | Provided, 3, fiction
Penguin | William S | Not Provided, 5, fiction
出版商將有不止一位作者,而一位作者可能有不止一本書詳細信息,在這種情況下,它看起來像:
Publisher | Author | BookDetails
-------------------------------------
Random House | John Smith | Provided, 3, fiction
| | Another, John Smith Book
Penguin | William S | Not Provided, 5, fiction
| Another Author | Another Authors details
| | Second book by another author
我的JSON看起來像:
JSONCollection = {
"genres": [{
"genre": "Horror",
"publishers": [{
"publisherName": "Random House",
"authors": [{
"authorName": "John Smith",
"bookDetails": [{
"Blurb": "Provided",
"Review": 3,
"Type": "Fiction"
}]
}]
}]
}, {
"genre": "Romance",
"publishers": [{
"publisherName": "Penguin",
"authors": [{
"authorName": "William Shakespeare",
"bookDetails": [{
"Blurb": "Not Provided",
"Review": 5,
"Type": "Fiction"
}]
}]
}]
}]
}
我正在使用的代碼(只是為了使發布者/作者能夠正常工作)是:
var table = $('#dataTable')
var table_thead = table.find('thead')
table_thead.empty()
var tr_head = $('<tr>')
.append($('<th>').text('publishers'))
.appendTo(table_thead)
var table_tbody = table.find('tbody')
table_tbody.empty()
var tr_body = $('<tr>')
for (var i = 0; i < JSONCollection.genres.length; i++) {
for (j = 0; j < JSONCollection.genres[i].publishers.length; j++) {
tr_body.append($('<td />').text(this.publisherName))
.appendTo(table_tbody)
for (k = 0; k < JSONCollection.genres[i].publishers[j].authors.length; k++) {
tr_body.append($('<td />').text(this.authorName))
.appendTo(table_tbody)
}
}
}
但這似乎不起作用,生成了Publisher標頭,然后此后什么也沒有,我在控制台中沒有收到任何錯誤。 任何想法,我要去哪里錯了?
這是一個小提琴: http : //jsfiddle.net/hE52x/
謝謝
我想你需要的是這個小提琴
var table = $('#dataTable');
var table_thead = $('#dataTable thead');
var table_tbody = $('#dataTable tbody');
var buffer="";
table_thead.html('<th>publishers</th><th>Authors</th>');
for (var i = 0; i < JSONCollection.genres.length; i++) {
buffer+='<tr>';
for (j = 0; j < JSONCollection.genres[i].publishers.length; j++) {
buffer+='<td>'+JSONCollection.genres[i].publishers[j].publisherName+'</td>';
buffer+='<td>';
for (k = 0; k < JSONCollection.genres[i].publishers[j].authors.length; k++) {
buffer+=(k==0?'':', ')+JSONCollection.genres[i].publishers[j].authors[k].authorName;
}
buffer+='</td>';
}
buffer+='</tr>';
}
table_tbody.html(buffer);
相反,我使用$.each()
來做到這一點:
$.each(JSONCollection.genres, function (i, item) {
$.each(item.publishers, function (i, item) {
tr_body.append($('<td />').text(item.publisherName)).appendTo(table_tbody);
$.each(item.authors, function (i, item) {
tr_body.append($('<td />').text(item.authorName)).appendTo(table_tbody);
});
});
});
附帶說明:
一個表只能將<thead>, <tbody>
作為直接子級。 正確的標記應如下所示:
<h2>Books</h2> <!--This should not be a direct child of table-->
<table id="dataTable">
<thead></thead>
<tbody></tbody>
</table>
在這里,我對您的代碼進行了一些調整
jQuery代碼:
JSONCollection = {
"genres": [{
"genre": "Horror",
"publishers": [{
"publisherName": "Random House",
"authors": [{
"authorName": "John Smith",
"bookDetails": [{
"Blurb": "Provided",
"Review": 3,
"Type": "Fiction"
}]
}]
}]
}, {
"genre": "Romance",
"publishers": [{
"publisherName": "Penguin",
"authors": [{
"authorName": "William Shakespeare",
"bookDetails": [{
"Blurb": "Not Provided",
"Review": 5,
"Type": "Fiction"
}]
}]
}]
}]
}
var table = $('#dataTable')
var table_thead = table.find('thead')
table_thead.empty()
var tr_head = $('<tr>')
.append($('<th>').text('Publishers'))
.append($('<th>').text('Author'))
.appendTo(table_thead)
var table_tbody = table.find('tbody')
table_tbody.empty()
var tr_body = $('<tr>')
for (var i = 0; i < JSONCollection.genres.length; i++) {
var tr_body = $('<tr>');
for (j = 0; j < JSONCollection.genres[i].publishers.length; j++) {
$this = JSONCollection.genres[i].publishers[j];
alert(JSONCollection.genres[i].publishers[j].publisherName);
tr_body.append($('<td />').text($this.publisherName))
.appendTo(table_tbody)
for (k = 0; k < JSONCollection.genres[i].publishers[j].authors.length; k++) {
$this = JSONCollection.genres[i].publishers[j].authors[k];
tr_body.append($('<td />').text($this.authorName))
.appendTo(table_tbody)
}
}
}
現場演示:
http://jsfiddle.net/dreamweiver/hE52x/19/
快樂編碼:)
為此,需要四個循環。 我用$.each()
實現了這一點。
第一個循環瀏覽各種類型,第二個循環通過發行者,第三個循環通過作者,最后一個循環通過書籍詳細信息。 它將照顧出版者有多於一位作者和出版者多於一本書/書名的出版商。
該表的初始HTML如下:
<table border="1" cellpadding="5" cellspacing="0" id="dataTable">
<thead>
<tr>
<td>Publisher</td>
<td>Author</td>
<td>Book Details</td>
</tr>
</thead>
<tbody></tbody>
</table>
jQuery代碼非常如下:
var tbody = $('#dataTable').find('tbody'),
tr = $('<tr/>'),
td = $('<td/>'),
genres = JSONCollection.genres,
row;
$.each(genres, function(index, genre) {
$.each(genre.publishers, function(i,publisher) {
$.each( publisher.authors, function(j, author) {
row = tr.clone().html( td.clone().html( publisher.publisherName ) )
.append( td.clone().html( author.authorName ) ).append( td.clone() );
$.each(author.bookDetails, function(l,book) {
row.find( 'td' ).eq( 2 ).append( (l>0)?'<br>':'' )
.append( book.Blurb + ', ' + book.Review + ', ' + book.Type );
});
row.appendTo( tbody );
});
});
});
編輯
該演示已進行了調整,以顯示該代碼將如何處理多個作者和書籍。 代碼略有調整。 一個CSS規則也增加了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.