为什么我不能访问嵌套JS对象中的属性? (Firebase快照)

时间:2018-01-12 19:15:17

标签: javascript json firebase foreach firebase-realtime-database

TLDR:请在JSON-snippet之后滚动到部分;)

我目前正在开发Firebase项目。我正在用JavaScript编写代码。从小时开始,我尝试从/写入对象中提取数据,但出于某种原因,我无法访问它的参数。

最初我的代码如下:

exports.updateUsersNewInterest = functions.database.ref('/category/{categoryID}/interest/{interestID}').onCreate(event =>{
        const interestID = event.params.interestID;
        const categoryID = event.params.categoryID;

        var ref = admin.database().ref("/userInterests/");
        ref.once("value").then(function(snapshot){
            snapshot.forEach(function(childSnapshot){

                var userID = childSnapshot.key;
                childSnapshotVal = childSnapshot.val();
                var rawSum = childSnapshotVal.rawSum;
                var rawCount = childSnapshotVal.rawCount;
                var norm = childSnapshotVal.norm;
                rawSum[interestID] = 0;
                rawCount[interestID] = 0;
                var resultObject = {};
                resultObject.norm = norm;
                resultObject.rawCount = rawCount;
                resultObject.rawSum = rawSum;               
                var ref1 = admin.database().ref("userInterests/"+userID);
                return ref1.set(resultObject);
            })
            return true
        })
        return true
})

由于某些原因我无法从forEach中的单个childSnapshot对象中读取密钥,我不得不使用另一次尝试:

exports.updateUsersNewInterest = functions.database.ref('/category/{categoryID}/interest/{interestID}').onCreate(event =>{
        const interestID = event.params.interestID;
        const categoryID = event.params.categoryID;

        //console.log(categoryID);
        //console.log(interestID);

        var ref = admin.database().ref("/userInterests/");
        ref.once("value").then(function(snapshot){
            var data = snapshot.val();

            var keys = Object.keys(data);
            console.log(typeof snapshot);
            for (var i = 0; i < keys.length; i++){
//At this point I cant access any properties
//console.log(data[i][rawSum] for example is NOT working
            //  data[i][rawSum][interestID] = 0;
            //  data[i][rawCount][interestID] = 0;
            }
                var ref1 = admin.database().ref("userInterests/");
                return ref1.set(data);
        })
        return true
})

现在的问题是,当我尝试在for循环中使用console.log键时,我得到了正确的结果。但是执行与$ data或$ snapshot的属性相关的任何类型的操作(即使var data = snapshot.val()应该给我一个对象?!不起作用。

我可能丢失了一些括号,将代码从sublime复制到此处,但是一般问题保持不变,即使我的代码片段在这里没有完成。

firebase控制台给出了错误:

TypeError: Cannot read property 'rawSum' of undefined at

该对象如下所示:

{ '2wewe': 
   { rawCount: 
  { '11': 1,
    '17': 0,
    '18': 0,
    '19': 0,
    '33': 0,
    '35': 0,
    '36': 0,
    '40': 0 },
 rawSum: 
  { '11': 1,
    '17': 0,
    '18': 0,
    '19': 0,
...

因此,如果我从Firebase导出快照,然后通过

提取其值
var values = snapshot.val()

我应该能够例如用

扭曲它
var abc = values[id]['rawCount'][itemID]

或者我错过了什么?

为什么

snapshot.forEach(function(childSnapshot){
            var userID = childSnapshot.key;

只是给我“未定义”?

非常感谢我(可能的菜鸟)问题的任何线索。

提前致谢!

1 个答案:

答案 0 :(得分:0)

data[i]应为data[keys[i]]。但您可以直接循环对象键,而不是调用Object.keys()

for (key in data) {
    if (data.hasOwnProperty(key)) {
        console.log(data[key].rawSum[interestID]);
        console.log(data[key].rawCount[interestID]);
    }
}