通过JSON数组建立索引

时间:2019-01-19 15:35:51

标签: javascript json

我试图在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);
});

3 个答案:

答案 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]); 
                }              
            }
        }
    }
}