你如何循环提供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
]
}
}
}
}
}
答案 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。