function getDataSets(data){
console.log(data);
for(key in data){
console.log(key,data[key]);
}
}
我正在将JavaScript对象(数据)传递给函数getDataSets
,当我console.log(data)
时,我能够看到对象内容 - 我能够扩展每个键的值(在控制台)并按预期查看它们的值(依次是JavaScript对象)。但是当for循环遍历每个键并且我尝试打印出每个键的值时 - 我得到类似<key name> Object {}
的东西,但键的值不是空对象。我想我在这里错过了一些微不足道的东西。有人可以帮我解决这个问题吗?
这是我为console.log(data)
Object {key1: Object, key2: Object, key3: Object, key4: Object, key5: Object}
即使data[key1]
给了我一个空对象。
console.log(JSON.stringify(data, null, 3))
的输出
{
"key1": {},
"key2": {},
"key3": {},
"key4": {},
"key5": {}
}
奇怪的是,当我再次直接从控制台运行getDataSets(data)
时,如果我直接在控制台中键入类似d = getDataSets(data)
的内容,我会得到预期的输出,键的值是非空的JavaScript对象。
编辑 -
function getData(platforms){
var data = {};
$.each(platforms,function(index,platform){
data[platform] = {};
var req = new XMLHttpRequest();
req.onload = function(){
//Here is the place each key of data is getting its value assigned
};
req.open('get',<some url>,true);
req.send();
})
return data;
}
我正在使用此getData
函数获取data
并将其发送给getDataSets
。我认为问题是getData
请求的URL正在加载一些,我猜。所以它甚至在请求URL之前传递data
,这就是为什么它的键初始化了一个空对象的原因。但那么console.log(data)
应该不正常吗?
答案 0 :(得分:1)
您发布的代码看起来不错。我猜你的代码中的其他地方正在改变“数据”或“密钥”的值。我运行了这段代码,它在Chrome中适用于我:
<script type="text/javascript">
var tmp = {abc: "123", def: {nested: "blah"}, xyz: 456 };
function test(data) {
console.log(JSON.stringify(tmp, null, 3));
for (x in tmp) {
console.log(x, tmp[x]);
}
}
test(tmp);
</script>
感谢发布附加代码,现在我看到了问题。您将在XMLHttpRequest返回之前返回“data”对象。您需要将“data”对象存储在“getData”函数之外的作用域中。在调用“onload”处理程序之前,不会填充“data”对象。 (将您的日志记录放在“onload”处理程序中以查看发生了什么。)
另外要小心,因为您正在制作多个XMLHTTPRequests,所以您需要跟踪请求,以便了解所有请求何时完成。 (他们可以按任何顺序返回。)