具有已知非空值JSON对象的字段将返回空字符串

时间:2013-01-06 23:34:50

标签: javascript json google-chrome-extension

我有一个包含各种社交指标的共享计数的对象。该对象如下所示:

Object{
delicious: 0,
facebook: {
    comments: 0,
    likes: 0,
    shares: 0,
    total: 0,
},
linkedIn: 1,
pinterest: 0,
twitter: 9
}

以下是我用来尝试访问我的对象的一些测试代码:

    console.log(bg.results);
    console.log(bg.results["facebook"]);
    console.log(bg.results.facebook);

Object.keys(bg.results).forEach(function(key){
    console.log(bg.results);
    console.log(key + "->" + bg.results[key]);
});

上面的对象是我在控制台中看到的,所以我知道bg.results中的字段包含数据。问题是,当我尝试使用点语法或使用object [“key”]访问任何这些字段时,我得到一个空字符串作为结果。我搜索过,找不到其他人遇到同样的问题。有没有人有任何想法可能会发生这种情况?

其他一些信息: 我的代码是在chrome扩展的上下文中运行的。我正在从弹出页面访问此对象,并且正在从我的后台页面提供对象的数据。

感谢您的协助。

更新

有趣的是Chrome正在处理我的代码。 bg.results中的数据由我的后台页面上的一个名为update的函数提供。在我的程序中,有两种方法可以根据用户的设置调用更新。当从我的后台页面的上下文中调用update()时,一切正常并且按预期运行。当从我的弹出页面调用update()时,当我尝试访问任何字段时,我得到空字符串。

这似乎是一个非常特殊的错误,如何处理chrome扩展,所以来自这类事情的专家的任何输入都会很棒。感谢大家的帮助!

3 个答案:

答案 0 :(得分:0)

1。)您的代码应该有效。 facebook本身就是一个对象所以你需要考虑这个问题,并且可能使用递归函数!

2。)为什么不用for-in-loop循环你的对象属性?

for(key in bg.results) {
   console.log(key);
}

3.)示例递归函数

function recursiveExample(obj) {
  var current;
  for(key in obj) {
   current = obj[key];
   if(typeof current === 'object' && !Array.isArray(current)) {
     recursiveExample(current);  
   }
   console.log("key: " + key + " - value" + current);
  }
}

答案 1 :(得分:0)

我得出结论,当我尝试访问它们时,我的值没有完全加载到结果对象中。我只能推测为什么当我将结果对象打印到控制台时我可以看到这些值(并且在那时无法访问它们)但是直到以后才能访问它们。以下是我用于此问题的解决方案。

function checkLoaded(results){
    var isLoaded = true;
    $.each(results, function(key, value){
        if(value === "" || value === undefined){
            isLoaded = false;   
        }
    });

    setTimeout(function(){
         if(!isLoaded){
            checkLoaded(results);
         }
         else{
            displayHandler(results);
         }
    }, 500);

}

如果有人知道为什么我可以在控制台中看到这些值但无法访问它们,我会很感激解释。但是否则,如果有其他人遇到这样的问题,请尝试设置延迟以确保您的值完全加载到您的集合中。

答案 2 :(得分:0)

这只是一个猜测(因为你没有发布任何相关的数据加载代码),但我怀疑你可能会做这样的事情:

chrome.extension.sendMessage({myAction: "update"}, function(response) {
     bg.results = response;
});

// we try to use bg.results, but the sendMessage callback won't be run until later on
Object.keys(bg.results).forEach(function(key){
    console.log(bg.results);
    console.log(key + "->" + bg.results[key]);
});

传递给sendMessage的ansychronous回调在当前函数堆栈清除后运行(即,一旦JavaScript线程用完了其他事情),所以{{1}在你尝试使用之后才会发生。相反,请使用回调中的结果

bg.results = response

也许你实际上并没有使用chrome.extension.sendMessage({myAction: "update"}, function(response) { bg.results = response; // now it works, because this code is inside the callback Object.keys(bg.results).forEach(function(key){ console.log(bg.results); console.log(key + "->" + bg.results[key]); }); }); ,但你必须使用一些异步操作(可能是Ajax,也许是另一个Chrome API调用)。我不知道该方法是肯定的,因为你没有发布任何数据加载代码。