Индексирование через массив JSON

ОК, так что я, наконец, решил это сделать. Публикация здесь для будущих людей (включая меня;)):

Проблема заключалась в том, что Gradle был более строгим, чем Javac, при работе с обработчиками аннотаций, которые были необходимы для создания моего отсутствующего файла. В этом случае мне просто пришлось добавить обработчик аннотации Log4j в список зависимостей -> annotationProcessor.

0
задан J P 19 January 2019 в 16:24
поделиться

3 ответа

Две полезные идеи: (1) объекты : если когда-нибудь это будет настоящая система, а данные из службы представляют группы людей, то код должен сказать это тоже. В качестве примера я включил простой объект Person, который знает, как создать себя из плоского представления, и знает, как отобразить себя на консоли. (2) порядок ключей не определен в объекте JS. Чтобы получить значения из специально упорядоченных ключей, необходимо указать порядок. Метод person 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();
        });
    });
}
0
ответ дан danh 19 January 2019 в 16:24
поделиться

Вы можете очистить внутренний цикл, посмотрев на каждую клавишу и передав только значение. Также я предлагаю вытащить 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]);
                }
            }
        }
    }
0
ответ дан GenericUser 19 January 2019 в 16:24
поделиться

Просмотрите свойства объекта с помощью цикла 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]); 
                }              
            }
        }
    }
}
0
ответ дан Sarah 19 January 2019 в 16:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: