使用 jQuery 对来自 Ajax 的 JSON 数据进行分组
Use jQuery to group JSON data coming from Ajax
我有以下数组,它是使用 PDO 从 MySQL 数据库中提取的。
[{
"tbl":"1",
"orid":"915",
"date":"2021-12-30 12:46:48",
"flag":0
},
{
"tbl":"2",
"orid":"914",
"date":"2021-12-30 12:46:21",
"flag":0
},
{
"tbl":"3",
"orid":"913",
"date":"2021-12-30 12:45:00",
"flag":0
},
{
"tbl":"1",
"orid":"911",
"date":"2021-12-30 12:27:17",
"flag":1
}]
我正在尝试通过 Ajax 和 build/attach div 相应地检索此数据。它不起作用,因为我什至无法显示数据参数和键。这是成功(数据)函数:
$.each(data,function(i,j){
content ='<span>'+j[i]+'<br /></span>';
$('.timeline').append(content);
});
我想按以下格式放置数据:
<div tbl="1">
<span class="header">Ref 1</span>
<div orid="915" class="order">...</div>
<div orid="911" class="order">...</div>
</div>
<div tbl="2">
<span class="header">Ref 2</span>
<div orid="914" class="order">...</div>
</div>
<div tbl="3">
<span class="header">Ref 3</span>
<div orid="913" class="order">...</div>
</div>
棘手的部分是将每个 order/orid 附加到现有的 tbl div 或者创建一个新的 tbl div 如果它不存在因为重复出现 ajax 调用(每次加载 10 行)。
这是您的示例数据的示例,我使用了 data-tbl
和 data-orid
属性而不是 tbl, orid
。
const data = [{
"tbl": "1",
"orid": "915",
"date": "2021-12-30 12:46:48",
"flag": 0
},
{
"tbl": "2",
"orid": "914",
"date": "2021-12-30 12:46:21",
"flag": 0
},
{
"tbl": "3",
"orid": "913",
"date": "2021-12-30 12:45:00",
"flag": 0
},
{
"tbl": "1",
"orid": "911",
"date": "2021-12-30 12:27:17",
"flag": 1
}
]
$.each(data, function(i, data) {
let target = $(`div[data-tbl=${data.tbl}]`)
if (target.length == 0) {
target = $(`<div data-tbl="${data.tbl}"><span class="header">Ref ${data.tbl}</span></div>`);
$('.timeline').append(target)
}
const content = `<div data-orid="${data.orid}" class="order">${data.orid}</div>`;
target.append(content);
});
.header{
color: green;
font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<div class="timeline"></div>
考虑以下因素。
$(function() {
var resultData = [{
"tbl": "1",
"orid": "915",
"date": "2021-12-30 12:46:48",
"flag": 0
},
{
"tbl": "2",
"orid": "914",
"date": "2021-12-30 12:46:21",
"flag": 0
},
{
"tbl": "3",
"orid": "913",
"date": "2021-12-30 12:45:00",
"flag": 0
},
{
"tbl": "1",
"orid": "911",
"date": "2021-12-30 12:27:17",
"flag": 1
}
];
function makeNewTable(tableData, target) {
if (tableData == undefined || target == undefined) {
return false;
}
var tableId = tableData.tbl;
var table = $("<div>", {
id: "table-" + tableId,
class: "table"
}).appendTo(target);
$("<div>", {
class: "header"
}).html("Ref " + tableId).appendTo(table);
$("<div>", {
class: "order"
}).data("orid", tableData.orid).html(tableData.date).appendTo(table);
$("<input>", {
type: "checkbox",
}).prop({
checked: tableData.flag == 1 ? true : false,
disabled: true
}).appendTo(table);
};
function updateTable(newData, target) {
if (newData == undefined || target == undefined) {
return false;
}
$("<div>", {
class: "order"
}).data("orid", newData.orid).html(newData.date).appendTo(target);
$("<input>", {
type: "checkbox",
}).prop({
checked: newData.flag == 1 ? true : false,
disabled: true
}).appendTo(target);
}
function showData(data, target) {
if (data == undefined || target == undefined) {
return false;
}
var tbl;
$.each(data, function(index, row) {
if ($("#table-" + row.tbl).length == 0) {
makeNewTable(row, $("#results-table"));
} else {
updateTable(row, $("#table-" + row.tbl));
}
});
}
showData(resultData, $("#results-table"));
});
.header {
font-weight: bold;
padding: 0.2em 0.4em;
}
.order {
display: inline-block;
padding: 0.2em 0.4em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="results-table">
</div>
您可以在此处了解如何更轻松地使用 Functions 分解不同的场景。这样您就可以根据需要制作新的 Table 或更新现有的 table。
更新
您可以考虑使用 DataTables。示例:https://jsfiddle.net/Twisty/u6bdcsqz/51/
主要代码:
function makeTable(keys, data, parent) {
var table = $("<table>").appendTo(parent);
$("<thead>").appendTo(table);
$("<tr>").appendTo($("thead", table));
$.each(keys, function(i, k) {
$("<th>").html(k).appendTo($("thead tr", table));
});
$("<tbody>").appendTo(table);
var row;
$.each(data, function(i, r) {
row = $("<tr>").appendTo($("tbody", table));
$("<td>").html("Table " + r.tbl).appendTo(row);
$("<td>", {
class: "order"
}).html(r.orid).appendTo(row);
$("<td>", {
class: "date"
}).html(r.date).appendTo(row);
$("<td>", {
class: "flag"
}).html(r.flag == 1 ? "X" : " ").appendTo(row);
});
var groupColumn = 0;
dataTable = table.DataTable({
"paging": false,
"columnDefs": [{
"visible": false,
"targets": groupColumn
}],
"order": [
[groupColumn, 'asc']
],
"drawCallback": function(settings) {
var api = this.api();
var rows = api.rows({
page: 'current'
}).nodes();
var last = null;
api.column(groupColumn, {
page: 'current'
}).data().each(function(group, i) {
if (last !== group) {
$(rows).eq(i).before(
'<tr class="group"><td colspan="3">' + group + '</td></tr>'
);
last = group;
}
});
}
});
table.on('click', 'tr.group', function() {
var currentOrder = table.order()[0];
if (currentOrder[0] === groupColumn && currentOrder[1] === 'asc') {
table.order([groupColumn, 'desc']).draw();
} else {
table.order([groupColumn, 'asc']).draw();
}
});
console.log("Table created, " + data.length + " rows.");
}
function updateTable(data) {
$.each(data, function(i, r) {
dataTable.row.add(["Table " + r.tbl, r.orid, r.date, r.flag]).draw(false);
});
console.log("Table updated, added " + data.length + " rows.");
}
function showData(tableData, target) {
if (tableData == undefined || target == undefined) {
return false;
}
if ($("table", target).length > 0) {
console.log("Table Found, updating");
updateTable(tableData, $("table", target));
} else {
console.log("No Table, creating.");
makeTable(["Table", "Order", "Date", "Flag"], tableData, target);
}
}
它比您想要的更多,但它提供了您所询问的所有功能。
我有以下数组,它是使用 PDO 从 MySQL 数据库中提取的。
[{
"tbl":"1",
"orid":"915",
"date":"2021-12-30 12:46:48",
"flag":0
},
{
"tbl":"2",
"orid":"914",
"date":"2021-12-30 12:46:21",
"flag":0
},
{
"tbl":"3",
"orid":"913",
"date":"2021-12-30 12:45:00",
"flag":0
},
{
"tbl":"1",
"orid":"911",
"date":"2021-12-30 12:27:17",
"flag":1
}]
我正在尝试通过 Ajax 和 build/attach div 相应地检索此数据。它不起作用,因为我什至无法显示数据参数和键。这是成功(数据)函数:
$.each(data,function(i,j){
content ='<span>'+j[i]+'<br /></span>';
$('.timeline').append(content);
});
我想按以下格式放置数据:
<div tbl="1">
<span class="header">Ref 1</span>
<div orid="915" class="order">...</div>
<div orid="911" class="order">...</div>
</div>
<div tbl="2">
<span class="header">Ref 2</span>
<div orid="914" class="order">...</div>
</div>
<div tbl="3">
<span class="header">Ref 3</span>
<div orid="913" class="order">...</div>
</div>
棘手的部分是将每个 order/orid 附加到现有的 tbl div 或者创建一个新的 tbl div 如果它不存在因为重复出现 ajax 调用(每次加载 10 行)。
这是您的示例数据的示例,我使用了 data-tbl
和 data-orid
属性而不是 tbl, orid
。
const data = [{
"tbl": "1",
"orid": "915",
"date": "2021-12-30 12:46:48",
"flag": 0
},
{
"tbl": "2",
"orid": "914",
"date": "2021-12-30 12:46:21",
"flag": 0
},
{
"tbl": "3",
"orid": "913",
"date": "2021-12-30 12:45:00",
"flag": 0
},
{
"tbl": "1",
"orid": "911",
"date": "2021-12-30 12:27:17",
"flag": 1
}
]
$.each(data, function(i, data) {
let target = $(`div[data-tbl=${data.tbl}]`)
if (target.length == 0) {
target = $(`<div data-tbl="${data.tbl}"><span class="header">Ref ${data.tbl}</span></div>`);
$('.timeline').append(target)
}
const content = `<div data-orid="${data.orid}" class="order">${data.orid}</div>`;
target.append(content);
});
.header{
color: green;
font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<div class="timeline"></div>
考虑以下因素。
$(function() {
var resultData = [{
"tbl": "1",
"orid": "915",
"date": "2021-12-30 12:46:48",
"flag": 0
},
{
"tbl": "2",
"orid": "914",
"date": "2021-12-30 12:46:21",
"flag": 0
},
{
"tbl": "3",
"orid": "913",
"date": "2021-12-30 12:45:00",
"flag": 0
},
{
"tbl": "1",
"orid": "911",
"date": "2021-12-30 12:27:17",
"flag": 1
}
];
function makeNewTable(tableData, target) {
if (tableData == undefined || target == undefined) {
return false;
}
var tableId = tableData.tbl;
var table = $("<div>", {
id: "table-" + tableId,
class: "table"
}).appendTo(target);
$("<div>", {
class: "header"
}).html("Ref " + tableId).appendTo(table);
$("<div>", {
class: "order"
}).data("orid", tableData.orid).html(tableData.date).appendTo(table);
$("<input>", {
type: "checkbox",
}).prop({
checked: tableData.flag == 1 ? true : false,
disabled: true
}).appendTo(table);
};
function updateTable(newData, target) {
if (newData == undefined || target == undefined) {
return false;
}
$("<div>", {
class: "order"
}).data("orid", newData.orid).html(newData.date).appendTo(target);
$("<input>", {
type: "checkbox",
}).prop({
checked: newData.flag == 1 ? true : false,
disabled: true
}).appendTo(target);
}
function showData(data, target) {
if (data == undefined || target == undefined) {
return false;
}
var tbl;
$.each(data, function(index, row) {
if ($("#table-" + row.tbl).length == 0) {
makeNewTable(row, $("#results-table"));
} else {
updateTable(row, $("#table-" + row.tbl));
}
});
}
showData(resultData, $("#results-table"));
});
.header {
font-weight: bold;
padding: 0.2em 0.4em;
}
.order {
display: inline-block;
padding: 0.2em 0.4em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="results-table">
</div>
您可以在此处了解如何更轻松地使用 Functions 分解不同的场景。这样您就可以根据需要制作新的 Table 或更新现有的 table。
更新
您可以考虑使用 DataTables。示例:https://jsfiddle.net/Twisty/u6bdcsqz/51/
主要代码:
function makeTable(keys, data, parent) {
var table = $("<table>").appendTo(parent);
$("<thead>").appendTo(table);
$("<tr>").appendTo($("thead", table));
$.each(keys, function(i, k) {
$("<th>").html(k).appendTo($("thead tr", table));
});
$("<tbody>").appendTo(table);
var row;
$.each(data, function(i, r) {
row = $("<tr>").appendTo($("tbody", table));
$("<td>").html("Table " + r.tbl).appendTo(row);
$("<td>", {
class: "order"
}).html(r.orid).appendTo(row);
$("<td>", {
class: "date"
}).html(r.date).appendTo(row);
$("<td>", {
class: "flag"
}).html(r.flag == 1 ? "X" : " ").appendTo(row);
});
var groupColumn = 0;
dataTable = table.DataTable({
"paging": false,
"columnDefs": [{
"visible": false,
"targets": groupColumn
}],
"order": [
[groupColumn, 'asc']
],
"drawCallback": function(settings) {
var api = this.api();
var rows = api.rows({
page: 'current'
}).nodes();
var last = null;
api.column(groupColumn, {
page: 'current'
}).data().each(function(group, i) {
if (last !== group) {
$(rows).eq(i).before(
'<tr class="group"><td colspan="3">' + group + '</td></tr>'
);
last = group;
}
});
}
});
table.on('click', 'tr.group', function() {
var currentOrder = table.order()[0];
if (currentOrder[0] === groupColumn && currentOrder[1] === 'asc') {
table.order([groupColumn, 'desc']).draw();
} else {
table.order([groupColumn, 'asc']).draw();
}
});
console.log("Table created, " + data.length + " rows.");
}
function updateTable(data) {
$.each(data, function(i, r) {
dataTable.row.add(["Table " + r.tbl, r.orid, r.date, r.flag]).draw(false);
});
console.log("Table updated, added " + data.length + " rows.");
}
function showData(tableData, target) {
if (tableData == undefined || target == undefined) {
return false;
}
if ($("table", target).length > 0) {
console.log("Table Found, updating");
updateTable(tableData, $("table", target));
} else {
console.log("No Table, creating.");
makeTable(["Table", "Order", "Date", "Flag"], tableData, target);
}
}
它比您想要的更多,但它提供了您所询问的所有功能。