Firebase不会使用空值保存密钥

时间:2014-12-20 13:49:38

标签: javascript object firebase

我有一个像这样的对象:

var _json = { "objects":[{
    "type":"path", "originX":"center", "originY":"center", "left":48.59, 
    "top":132.5, "width":64.5,"height":173, "fill":null,"stroke":"#3f7cc4", 
    "strokeWidth":12,"strokeDashArray":null
}]}

我使用Firebase保存此对象:

var myDataRef = new Firebase(<...>);
myDataRef.child("saved_projects").child(authData.uid).update({'P3': _json});

但是,当我使用Firebase on方法检索相同内容并获取值为:

snapshot.val()

我得到了对象,但null值的键被删除了,即我只得到了:

{"objects":[ {"type":"path", "originX":"center", 
 "originY":"center","left":48.59, "top":132.5,"width":64.5, 
 "height":173, "stroke":"#3f7cc4","strokeWidth":12
}]}

这引起了一些奇怪的问题,因为我使用Fabric.js并且它需要这些值。 请帮忙!

编辑/更新(黑客)

目前,在将对象存储到Firebase之前,我使用了一个奇怪的HACK,并将所有null值转换为0。但我想知道一个更好的方法。

function recursivelyReplaceNullToZero(j) {
    for (var i in j){
        if (typeof j[i] === "object") {
            recursivelyReplaceNullToZero(j[i]);
        }
        if (j[i] === null) {
            j[i] = 0;
        }
    }
}
recursivelyReplaceNullToZero(_json);

3 个答案:

答案 0 :(得分:3)

目前我正在使用一个奇怪的HACK,在将对象存储到Firebase之前我将所有空值转换为0.但我想知道更好的方法,请!

function recursivelyReplaceNullToZero(j) {
    for (var i in j){
        if (typeof j[i] === "object") {
            recursivelyReplaceNullToZero(j[i]);
        }
        if (j[i] === null) {
            j[i] = 0;
        }
    }
}
recursivelyReplaceNullToZero(_json);

答案 1 :(得分:0)

这是预期的行为。 AFAIK json系统的工作原理如下。

您应该在代码集中为数据库中不存在的键设置空值。
打个比方:想想前导零-您不要在数字前写。

答案 2 :(得分:0)

fill将是类型string,并且在Firestore中可以为空。 strokeDashArray将是类型array,并且它们也可以包含空的string(以及其他数据类型)。请参见下图,其中是Firestore的屏幕截图。不过,您对null是正确的,它不会存储值为null的属性。

请记住,尽管Firestore是文档数据库,并且没有架构-这意味着并非每个文档都必须具有所有字段(半结构化)。

因此,与其存储无价值的属性,不如简单地处理该属性可能不存在于代码中的可能性,例如

if(doc.exists){
  if(doc.data().fill){
    // now you do what you want with the fill property
  } else {
    // there is no fill data
  }
}

enter image description here