javascript - 了解将 JSON 对象循环到 HTML 表(排序和条件)
问题描述
我有很长的 JSON 数据,其中对象有点长,上面有一些编号。我应该做的是让 JSON 与 Head 一起表是每个对象的数量。
这是我所做的事情的快照(使用 JSON 数据)
jsfiddle 我做的循环是让thead和tbody像这样
$.each(Object.keys(myObj.data[0]), function(_, key) {
tr.append("<th>" + key + "</th>");
});
tr.appendTo(thead);
$.each(myObj.data, function(_, obj) {
tr = $("<tr />");
$.each(obj, function(_, text) {
if (!text.namashift) {
tr.append("<td>" + text + "</td>")
} else {
tr.append("<td>" + text.namashift + "</td>")
}
});
tr.appendTo(tbody);
});
这是我掌握和想要的,但有几个问题我做不到:
- 对 JSON 进行排序,我想要的是第一列的“id”“nama”“bulan”“tahun”thead,这是因为 JSON 是无序的?尽管在 JSON 列表中对象位于前面,但当成为表格时,它会位于后面。
- 使条件只有对象“nama”并且所有数字对象都出现在表格上(1-31)
- 如果某些 JSON 对象数组的编号不同怎么办(例如,一个数组是 1-30,另一个是 1-31。那么最后一列的 1-30 td 为空白)
这是我第一次处理这样的事情,我想在未来更多地了解 JSON。数组列表有点不同......同时我想要最有效的方法来做到这一点。我希望有人能给我Light,非常感谢。
解决方案
您的第一个选择是提供一个固定的表格,但是当您开始走数据驱动的路线时,让我们排除这种可能性。
固定表是在 HTML 中预定义表的位置,然后您向其中添加数据。
硬编码表是对数据进行假设的地方,例如它有 31 列。因此,您可以将循环编写为基本for
循环:
for (var i=0;i<=31;i++) {
tr.append("<th>" + i + "</th>");
在上述两种情况下,如果您的数据发生变化(例如添加一列31
),那么您需要更新 HTML。这就是我们编写数据驱动应用程序的原因(假设我们可以信任数据源......)
排序 JSON [列] - “id” “nama” “bulan” “tahun” thead 作为第一列
该答案在此处提供了详细信息。总之,首先显示“数字”键,然后显示字母键。
要按您想要的顺序获取它们,您可以更改数据,使其不是数字,例如从
[ { "2": { "shift": "9" ...
至
[ { "key2": { "shift": "9" ...
然后确保您的其他列在前面并调整您的代码以排除前缀。
假设您不想更改键,您可以更改thead
循环,以便它首先找到 alpha 键(两个循环),例如:
let tr = $("<tr />");
$.each(Object.keys(myObj.data[0]), function(_, key) {
if (parseInt(key)) return;
tr.append("<th>" + key + "</th>");
});
$.each(Object.keys(myObj.data[0]), function(_, key) {
if (!parseInt(key)) return;
tr.append("<th>" + key + "</th>");
});
tr.appendTo(thead);
这里有点干,但只要tr.append
不是太长,没有人应该抱怨。
您还需要更改 tbody 循环以使它们以正确的顺序排列
但是,当结合下一个要求时,就不需要上面的了,因为只有一个非数字标题
仅设置条件对象“nama”,所有数字对象都出现在表中 (1-31)。
在这种情况下,nama
首先添加列,然后是数字列,使用与上述相同的条件,例如:
let tr = $("<tr />");
tr.append("<th>nama</th>");
$.each(Object.keys(myObj.data[0]), function(_, key) {
if (!parseInt(key)) return;
tr.append("<th>" + key + "</th>");
});
tr.appendTo(thead);
同样,这将需要更改数据循环 - 我们可以在下面简化。
如果某些 JSON 对象数组的编号不同怎么办(例如,一个数组是 1-30,另一个是 1-31。那么最后一列的 1-30 td 为空白)
在这种情况下,您应该首先解析列表以找到您感兴趣的所有键,然后在每个 tr 上创建相同的键。
在 data[0] 包含所有必需标头的简单形式中,它将是:
let cols = [];
cols.push("nama");
$.each(Object.keys(myObj.data[0]), function(_, key) {
if (!parseInt(key)) return;
cols.push(key);
});
但我们也希望获得其他列 - 在你的小提琴中,我从第一个数据中删除了“1”,并在第二个数据中添加了“33”以显示这些工作(缺少 32,所以它不在列中)
让列 = []; $.each(myObj.data, ( , data) => { $.each(Object.keys(data), function( , key) { if (!parseInt(key)) return; if (!cols.includes(key )) cols.push(key); }); }); // 这里使用数字排序 cols = cols.sort(function(a, b) { return a - b; }); // 在前面添加特定的列 cols.unshift("nama");
需要对它们进行排序以使最初丢失的“1”回到开头。
或者,您可以在这里得到一个最小值-最大值,它们都呈现在两者之间,这也将输出“32”。
然后通过循环列而不是数据键添加到表中
let tr = $("<tr />");
$.each(cols, (_,key) => tr.append("<th>" + key + "</th>") );
tr.appendTo(thead);
$.each(myObj.data, function(_, obj) {
tr = $("<tr />");
$.each(cols, (_,key) => {
tr.append("<td>"
+ (!obj[key]
? ""
: (obj[key].namashift
? obj[key].namashift
: obj[key]))
+ "</td>")
});
tr.appendTo(tbody);
});
Where!obj[key] ? ""
检查缺失值,并且obj[key].namashift ?
是您对 namashift 与 namashift 本身的数字键的原始检查。if / else
为了您自己的清楚,您可以将其扩展为。
更新小提琴:https ://jsfiddle.net/rz26xabm/
或者,如果您可以更改 JSON,则添加一个“标题”行来描述如何构建表并在其上循环。
推荐阅读
- ruby-on-rails - 使用 Rails 6,您将“特定于页面”的 JavaScript 代码放在哪里?
- java - Android Studio - projetct 文件夹中只有一个 build.gradle
- javascript - 如何从 Chrome 的 JavaScript 中的 a.href 属性获取相对路径?
- python - PyQt5 嵌入 3D 散点图
- c++ - 输入一个字符串文本,然后用空格分割它们,然后添加到链表中它会怎么样?
- arrays - 使用 Powershell 将哈希表数组格式化为表
- arrays - pyarrow parquet - 将数组编码为记录列表
- c++ - 如何使用 typedef 创建多个数组?
- c# - WPF 在 DataTemplate 中使用静态资源
- java - 我在 for 循环中大写了太多元素,但仅在特定索引上