Javascript:循环访问JSON

时间:2014-12-02 07:15:44

标签: javascript json recursion

你如何循环提供JSON来获得多年来的每个年级并将它们粘贴到数组中?我对JS很新,所以任何解释都是受欢迎的。 这个例子的预期数组是[2,4,2,5,4,5,4.5,2,3.5,5,5,5,5,5]

{
    "first_name": "Ala",
    "last_name": "Kowalski",
    "birth_date": "29 AUG 1990",
    "indeks_number": "9454530",
    "year_of_study": "2",
    "courses": {
        "2013": {
            "AlgorithmsI": {
                "grades": {
                    "exercices": [
                        2,
                        4
                    ],
                    "lecture": [
                        2,
                        5
                    ]
                }
            },
            "BasicPhysicsI": {
                "grades": {
                    "exercices": [
                        4
                    ],
                    "lecture": [
                        5
                    ]
                }
            },
            "ProgrammingI": {
                "grades": {
                    "exercices": [
                        4.5
                    ],
                    "lecture": [
                        2,
                        3.5
                    ]
                }
            }
        },
        "2014": {
            "ProgrammingII": {
                "grades": {
                    "exercices": [
                        5
                    ],
                    "lecture": [
                        5
                    ]
                }
            },
            "BasicPhysicsII": {
                "grades": {
                    "exercices": [
                        5
                    ],
                    "lecture": [
                        5
                    ]
                }
            },
            "AlgorithmsII": {
                "grades": {
                    "exercices": [
                        5
                    ],
                    "lecture": [
                        5
                    ]
                }
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

我可能会使用JSON.stringify作为迭代对象的方法:

grades = [];
JSON.stringify(obj, function(key, value) {
    if (key === 'grades') 
        grades = grades.concat(value.exercices, value.lecture);
    return value;
});

如何运作

JSON.stringify旨在将对象转换为JSON字符串。为此,它会迭代所有级别的对象中的所有值。它还提供了指定replacer参数的功能,该参数是使用它遇到的每个键/值对调用的函数。在这里,我们使用replacer来控制字符串化,但是有机会检查每个键/值对以查看密钥是否为'grades',如果是,则将这些成绩添加到{{ 1}}数组。我们必须返回grades,以便value继续迭代。 JSON.stringify的实际结果无关紧要并被丢弃。

答案 1 :(得分:0)

var grades = [];
var obj = <your Object>;

processObj(obj);

function processObj(obj) {
    for (var n in obj) {
        if (n=='exercices' || n=='lectures') {
            for (var j=0;j<obj[n].length;j++) {
                grades.push(obj[n][j]);
            }
        } else {
            processObj(obj[n]);
        }
     }
}

答案 2 :(得分:0)

嗨,你可以试试这个。

function looop(jsonob) {
    var gradeArray = [];
    for (years in jsonob.courses) {
        for (lessons in jsonob.courses[years]) {
            for (x in jsonob.courses[years][lessons].grades.exercices) {
                gradeArray.push(jsonob.courses[years][lessons].grades.exercices[x]);
            }
            for (x in jsonob.courses[years][lessons].grades.lecture) {
                gradeArray.push(jsonob.courses[years][lessons].grades.lecture[x]);
            }
        }
    }
    return gradeArray;
}

答案 3 :(得分:0)

递归:

function each(object, iterator) {
    Object.keys(object).forEach(function (key) {
        var value = object[key];
        iterator(value, key);
    });
}

function inArray(array, value) {
    return array.indexOf(value) > -1;
}

function isPlainObject(value) {
    return !!value && typeof value === 'object' && value.constructor === Object;
}

function getGrades(data) {
    var grades = [];
    each(data, function (value, key) {
        if (inArray(['exercices', 'lecture'], key)) {
            grades = grades.concat(value);
        } else if (isPlainObject(value)) {
            grades = grades.concat(getGrades(value));
        }
    });
    return grades;
}

您可以使用以下命令在Node.js中测试:

var assert = require('assert');
assert.deepEqual(getGrades(fixture),
                 [2, 4, 2, 5, 4, 5, 4.5, 2, 3.5, 5, 5, 5, 5, 5, 5]);

fixture是你的JSON。