【问题标题】:Having trouble iterating through Javascript objects遍历 Javascript 对象时遇到问题
【发布时间】:2016-10-17 12:34:39
【问题描述】:

我在访问 JS 对象中的数据时遇到了问题。收集数据(来自 Firebase 数据库)的代码如下:

var get_user_data = function() {
    ...
    snapshot.forEach(function(child){
        var key = child.key;
        var value = child.val();
        user_char[key] = value;
        console.log(key, value);
    });
    store_user_char(user_char);
}

var store_user_char = function(user_char) {
    char_obj = user_char;
    console.log(char_obj);
    for(var key in char_obj){
        if(char_obj.hasOwnProperty(key)){
            console.log(key);
        }
}

应该(理论上)从 Firebase 数据库创建 JS 对象,并且在将数据写入 user_char 时,它会将每个 key:object 对打印到控制台中。之后,当 store_user_char() 执行时,它还应该打印出之前的每个键。

第一个 console.log() 在写入 user_char 时成功输出每个 key:object 对。第二个 console.log() 成功输出对象,我什至可以单击并编辑里面的所有元素,在 Firefox 控制台中看起来像这样:

但是第三个 console.log() 永远不会执行,并试图通过访问这样的键从 char_obj 获取任何数据:

char_obj['KSxpjEvkCOL6ugGkxqn']

什么都不做并返回undefined。奇怪的是,在 Firefox 中手动单击对象允许我解析每个子元素,因此我知道数据存储在某个地方。

我唯一能想到的是来自数据库的请求可能需要很长时间才能返回数据,但即使这样,store_user_char() 函数也应该在数据存储到 user_char 之后执行,所以我非常困惑至于为什么我的代码似乎无法遍历对象。

我觉得我好像遗漏了一些关于 JS 对象的东西,这就是我的代码找不到数据的原因,但我一直在试图弄清楚发生了什么以及我是如何做到的可以访问数据。

任何关于此事的帮助将不胜感激!

编辑:get_user_data 的完整定义如下:

// Global variables
var user_email;
var user_char = {};
var uid;

var get_user_data = function() {
    // Authenticate current user
    var user = firebase.auth().currentUser;

    // Get User Email and char list
    if (user != null) {
        user_email = user.email;
        uid = firebase.auth().currentUser.uid;
        var getChar = firebase.database().ref('/users/' + uid + '/chars/').orderByKey();
        getChar.on('value', function(snapshot){
            snapshot.forEach(function(child){
                var key = child.key;
                var value = child.val();
                user_char[key] = value;
            });
        });
        store_user_char(user_char);
    }
}

【问题讨论】:

  • user_char 到底是什么?只是一个普通的对象?
  • 我的猜测是 hasOwnProperty() 不会评估从 user_char 继承的 char_obj 的属性,因为它不会评估继承的属性。
  • @Feathercrown char_obj = user_char 创建 user_char 到 char_obj 的引用,它与继承无关。虽然你是正确的 hasOwnProperty() 为继承的属性返回 false ...
  • 是 @MinusFour 其初始化为 var user_char = {};
  • @shstyoo 那么它没有什么可评估的! var user_char = { bleh: "blah", pingas: ["snoo-","usual I see"], foo: "bar" } var char_obj = user_char; console.log(char_obj); for(var key in char_obj){ if(char_obj.hasOwnProperty(key)){ console.log(key); } } 为我工作....

标签: javascript firebase firebase-realtime-database javascript-objects


【解决方案1】:
getChar.on('value', function(snapshot){
    snapshot.forEach(function(child){
        var key = child.key;
        var value = child.val();
        user_char[key] = value;
    });
});

会被异步调用,把函数调用store_user_char(user_char);在 getChar 的回调中,您的问题将得到解决。 喜欢:

getChar.on('value', function(snapshot){
        snapshot.forEach(function(child){
            var key = child.key;
            var value = child.val();
            user_char[key] = value;
        });
       store_user_char(user_char);
    });

【讨论】:

  • 我认为你是对的,我有 store_user_char();在 getChar 之外执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
相关资源
最近更新 更多