首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解将JSON对象循环到HTML表(排序和条件)

了解将JSON对象循环到HTML表(排序和条件)
EN

Stack Overflow用户
提问于 2021-03-01 22:01:26
回答 1查看 40关注 0票数 0

我有很长的JSON数据,其中对象有点长,上面有一些编号。我应该做的是让JSON to table,标题是每个对象的编号。

这是我所做的事情的快照(使用JSON数据)

jsfiddle

我做的循环使头部和身体像这样

代码语言:javascript
运行
复制
$.each(Object.keys(myObj.data[0]), function(_, key) {

  tr.append("" + key + "");

});
tr.appendTo(thead);

$.each(myObj.data, function(_, obj) {
  tr = $("");
  $.each(obj, function(_, text) {

    if (!text.namashift) {
      tr.append("" + text + "")
    } else {
      tr.append("" + text.namashift + "")
    }

  });
  tr.appendTo(tbody);
});

这是我想要的,但有几个问题我做不到:

对JSON进行排序,我想要的是第一列中的"id“"nama”"bulan“"tahun”标题,是因为JSON是无序的吗?虽然在JSON列表中对象是在前面的,但是当变成表的时候,它是放在后面的。

Make condition only object "nama“和所有number对象都出现在表中(1-31)

如果某些JSON对象数组不具有相同的编号(例如:一个数组是1-30,另一个是1-31。则最后一列1-30 td为空)

这是我第一次处理这样的事情,我想在将来更多地了解JSON。这和数组列表有点不同...同时,我想要最有效的方式来做到这一点。我希望有人能给我一些启发,非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 22:59:21

您的第一个选择是提供一个固定的表,但是由于您已经开始了数据驱动的路线,所以让我们排除这种可能性。

固定表是指在HTML中预定义该表,然后向其中添加数据。

硬编码表是对数据进行假设的地方,比如它有31列。所以你可以把你的循环写成一个基本的

循环:

代码语言:javascript
运行
复制
for (var i=0;i<=31;i++) {  
    tr.append("" + i + "");

在上述两种情况下,如果您的数据发生更改(例如添加列

),则需要更新HTML。这就是为什么我们编写数据驱动的应用程序(假设我们可以信任数据源...)

对JSON进行排序

- "id“"nama”"bulan“"tahun”标题作为第一列

这个答案

此处提供了详细信息。总之,“数字”键首先显示,然后是字母键。

为了让它们按你想要的顺序排列,你可以改变你的数据,使它不是数字,例如从

代码语言:javascript
运行
复制
[ { "2": { "shift": "9" ...

代码语言:javascript
运行
复制
[ { "key2": { "shift": "9" ...

然后确保其他列在前面,并调整代码以排除前缀。

假设您不想更改密钥,您可以更改您的

循环,以便首先找到alpha键(两个循环),例如:

代码语言:javascript
运行
复制
let tr = $("");
$.each(Object.keys(myObj.data[0]), function(_, key) {
  if (parseInt(key)) return;
  tr.append("" + key + "");
});
$.each(Object.keys(myObj.data[0]), function(_, key) {
  if (!parseInt(key)) return;
  tr.append("" + key + "");
});
tr.appendTo(thead);

这里有点枯燥,但只要

不会太长,没人会抱怨。

您还需要更改tbody循环以获得正确的顺序

但是,当与下一个需求结合使用时,不需要执行上述操作,因为只有一个非数字标头

Make condition only object "nama“和所有number对象都会出现在表中(1-31)。

在这种情况下,添加

首先是列,然后是数字列,使用与上面相同的条件,例如:

代码语言:javascript
运行
复制
let tr = $("");
tr.append("nama");
$.each(Object.keys(myObj.data[0]), function(_, key) {
  if (!parseInt(key)) return;
  tr.append("" + key + "");
});
tr.appendTo(thead);

同样,这将需要对数据循环进行更改-我们可以在下面更容易地实现这一点。

如果某些JSON对象数组不具有相同的编号(例如:一个数组是1-30,另一个是1-31。则最后一列1-30 td为空)

在这种情况下,您应该解析列表

首先

找到

全部

您感兴趣的密钥,然后在每个tr上创建相同的密钥。

在简单的表单中,数据

包含所有必需的标头,则为:

代码语言:javascript
运行
复制
let cols = [];
cols.push("nama");
$.each(Object.keys(myObj.data[0]), function(_, key) {
  if (!parseInt(key)) return;
  cols.push(key);
});

但我们也希望得到其他列-在您的小提琴中,我已经从第一个数据中删除了"1“,并在第二个数据中添加了"33”,以显示这些工作(缺少32,因此它不在列中)

令cols = [];$.each(myObj.data,(

,data)函数{ $.each(Object.keys(data),=> (

,key) { if (!parseInt(key)) return;if (!cols.includes(key)) cols.push(key);});//在此处使用数字排序cols =cols.sort(cols.unshift(a,b) { return a- b;});//在前面添加特定列(“nama”);

需要对它们进行排序,以使最初丢失的"1“回到开头。

或者,你可以得到一个最小-最大值在这里渲染所有之间,这也将输出"32“。

然后,通过循环cols,而不是数据键,将其添加到表中

代码语言:javascript
运行
复制
let tr = $("");
$.each(cols, (_,key) => tr.append("" + key + "") );
tr.appendTo(thead);

$.each(myObj.data, function(_, obj) {
  tr = $("");
  $.each(cols, (_,key) => {
     tr.append("" 
               + (!obj[key] 
                     ? "" 
                     : (obj[key].namashift 
                          ? obj[key].namashift 
                          : obj[key])) 
               + "") 
  });
  tr.appendTo(tbody);
});

在哪里

检查缺少的值和

是您对namashift与namashift本身的数字键的原始检查。您可以将其扩展为

为了你自己的清晰度。

小提琴更新:

https://jsfiddle.net/rz26xabm/

或者,如果可以更改JSON,则添加一个"header“行来描述如何在其上构建表和循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66423498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档