JavaScript对象 - 键的值为空

时间:2014-02-20 17:13:03

标签: javascript

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)应该不正常吗?

1 个答案:

答案 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,所以您需要跟踪请求,以便了解所有请求何时完成。 (他们可以按任何顺序返回。)