这里我正在迭代存储在javascript对象中的JSON对象并打印其中的一些值。
database.ref().once("value", function (snap) {
//store javascript object containing JSON objects in scores variable.
scores = snap.val();
for(var key in scores){
console.log(scores[key].Name);
}
});
得分对象看起来像这样。
for循环如何检索每个JSON对象中的键并存储在名为“key”的变量中?
由于分数不是数组而是javascript对象,for循环如何工作?
例如scores[1].Name
无效。所以,它不是基于索引的。
答案 0 :(得分:2)
在您的示例中,您有一个看起来像这样的对象:
var obj = {
'key1': {name: 'Josh', score: 9},
'key2': {name: 'July', score: 30},
'key3': {name: 'Joy', score: 18},
'key4': {name: 'Barbara', score: 50},
};
执行for (var key in obj) {...}
将遍历初始对象的所有键。在该示例中,这将是['key1', 'key2', 'key3', 'key4']
。
您说得对,只能通过索引访问数组项。对于对象,可以通过键(字符串)访问子对象。
以下工作:
// Directly when you know the key name
console.log(obj.key1.name); // Will print out 'Josh'
// Using a variable when the key name is stored in a variable
var customKey = 'key1';
console.log(obj[customKey].name); // Will print out 'Josh'
在您的初始示例中,您使用for ... in
结构遍历对象键,然后按键访问嵌套对象。
您可以使用以下示例验证我的意思:
database.ref().once("value", function (snap) {
//store javascript object containing JSON objects in scores variable.
scores = snap.val();
for(var key in scores){
console.log(key); // See what's inside your key variable
console.log(scores[key].Name);
}
});
答案 1 :(得分:1)
for...in
语句迭代给定对象的enumerable properties。
假设您有以下对象:
var o = {
a: 1,
b: 2,
c: {
d: 3
}
};
这样做的:
for (var key in o) console.log(key, o[key]);
将打印:
a 1
b 2
c { d: 3 }
我认为重要的是要记住for...in
语句也会遍历对象的inherited properties。
这样做的:
o.__proto__.x = 4;
for (var key in o) console.log(key, o[key]);
将打印:
a 1
b 2
c { d: 3 }
x 4
如果您只想直接遍历属于该对象的属性而不是原型链,您可以使用Object.keys()
:
var o = {
a: 1,
b: 2,
c: function () {}
};
o.__proto__.x = 4;
o.__proto__.y = function () {};
var keys = Object.keys(o);
for (var i = 0; i < keys.length; i++) console.log(keys[i], o[keys[i]]);
上面的代码打印:
a 1
b 2
c function () {} //functions are also enumerable