我试图在JavaScript中的JSON列表中建立索引,但要使其正常工作却遇到了很多麻烦。
我尝试索引每个JSON项目的值,但没有输出我想要的。我认为我可以使它正常工作,但这对于循环级别来说是多余的。这是我的JSON:https://pastebin.com/iYmaA4c5。如果您认为重新格式化JSON更好,那么这也可能会有所帮助。
function output_json(data) {
var i, j, k;
for (i=0; i<Object.keys(data).length; i++) {
group_=Object.values(data)[i];
for (j=0; j<Object.keys(group_).length; j++) {
person=Object.values(group_)[j];
person_id=Object.keys(person)[0];
console.log(person_id);
for (k=0; k<Object.keys(person).length; k++) {
person_info=Object.values(person)[k][0];
console.log(person_info);
}
}
}
}
我希望它打印出ID,然后打印出每个ID的名称,注册1,注册2,星期和half_term。目前,它的打印内容如下:
HA09_000
{名称:“怀亚特·费尔德(Wyatt Feldt)”,注册_1:“ R”,注册_2:“ R”,周:0,半学期:1}
但是我希望它像这样打印每一个:
HA09_000
怀亚特·费尔德特
R
R
0
1
以下是我想要实现的伪代码:
FOR GROUP IN DATA:
FOR PERSON IN GROUP:
PRINT(PERSON.ID)
FOR INFO IN PERSON:
PRINT(INFO)
谢谢。
编辑:这是我用来检索数据的功能:
$.getJSON("http://localhost:8000/data.json", function(data) {
output_json(data);
});
答案 0 :(得分:2)
两个有用的想法:(1)对象:如果有朝一日这将成为一个真实的系统,并且服务中的数据代表人群,那么代码也应该这样说。作为示例,我包括了一个简单的Person
对象,该对象知道如何通过平面表示来构建自身,并且知道如何在控制台上进行呈现。 (2)在JS对象中未确定键顺序。要从专门排序的键中获取值,必须指定顺序。人print()
方法用一个数组来做到这一点。
在这里看到它,在数据的子集上运行...
$.getJSON("http://localhost:8000/data.json", function(data) {
print_items(data);
});
class Person {
constructor(data) {
this.id = Object.keys(data)[0];
this.state = data[this.id][0];
}
print() {
console.log(this.id);
let displayKeys = ['name', 'registration_1', 'registration_2', 'week', 'half_term'];
displayKeys.forEach(key => console.log(this.state[key]));
}
asTableRow() {
let displayKeys = ['name', 'registration_1', 'registration_2', 'week', 'half_term'];
let tds = displayKeys.map(key => `<td>${this.state[key]}</td>`);
return `<tr>${tds}</tr>`;
}
}
function print_items(data) {
Object.keys(data).forEach(groupKey => {
let group = data[groupKey];
Object.keys(group).forEach(personKey => {
let person = new Person(group[personKey]);
person.print();
});
});
}
答案 1 :(得分:0)
您可以通过查看每个键并仅传递值来清理内部循环。我也建议将Object.keys(person).length
从for循环中拉出,因为它将处理每个循环中的键。如果将它们放入变量并进行引用,则可以避免重新评估密钥。
var groups = Object.keys(testData);
for(var i = 0; i<groups.length; i++){
var group = testData[groups[i]];
for(var j = 0; j<group.length; j++){
var personEntry = group[j];
var person_id = Object.keys(personEntry)[0];
console.log(person_id);
var personEntries = personEntry[person_id];
for(var k = 0; k<personEntries.length; k++){
var personValues = Object.values(personEntries[k]);
for(var l = 0; l<personValues.length; l++){
console.log(personValues[l]);
}
}
}
}
答案 2 :(得分:0)
使用for / in循环浏览对象的属性。
我已经在您的代码中添加了for / in循环(使用person_info对象)并对其进行了测试,它正在打印您想要的内容。 希望这会有所帮助。
function output_json(data) {
var i, j, k;
for (i=0; i<Object.keys(data).length; i++) {
group_=Object.values(data)[i];
for (j=0; j<Object.keys(group_).length; j++) {
person=Object.values(group_)[j];
person_id=Object.keys(person)[0];
console.log(person_id);
for (k=0; k<Object.keys(person).length; k++) {
person_info=Object.values(person)[k][0];
//loop through the properties of the person_info object
//using a for/in loop
for (var key in person_info) {
console.log(person_info[key]);
}
}
}
}
}