我从Firebase数据库中删除元素时遇到问题。结构如下(只是一个样本):
{
"users":
[
{
"id": 0,
"name": "Toma Broome"
},
{
"id": 1,
"name": "Boyd Bolens"
}
]
}
我获取用户列表的连接是这样的:
firebase.database().ref("/users/").on("value", snap => {
users = snap.val();
console.log( users ); // pay attention to this line
usersLoop();
});
然后我在屏幕上渲染元素,我尝试删除一个:
firebase.database().ref(`/users/${targetEl}`).remove();
如果我检查Firebase控制台,该元素实际上已从数据库中删除,但users数组包含undefined
值,删除某些元素后,它返回一个对象而不是数组。
删除位于数据库第一个位置的三个元素后,这是控制台。我的意思是我得到完整的用户列表(我使用JSON文件上传),删除第一个元素,然后在DOM中重新呈现所有其他元素。然后我再次删除第一个元素,最后当我第三次删除第一个元素时,我从firebase获取一个对象,显然没有渲染,因为代码需要一个数组
(5) [undefined × 1, Object, Object, Object, Object]
(5) [undefined × 2, Object, Object, Object]
Object {3: Object, 4: Object}
另外正如您所看到的,当数据库中的元素较少时,数组会保持返回长度为5的长度。
我正在考虑的一个选项是使用Lodash从返回的集合中删除未定义的元素和/或将其转换为数组,但这将违反应用程序未来的任何可伸缩性选项。
最后看起来比任何东西都更奇怪的是,数据库结构突然发生变化,当视觉上看起来完全一样时。
这是firebase上数据库的结构
-users
|-0
|-id:0
|-name:value
|-otherprops:value
|-1
|-id:1
|-name:value
|-otherprops:value
答案 0 :(得分:2)
@cartant提供的链接给出了答案。
是的,firebase确实容忍其数据中的数组结构,但不建议使用它们,除非特定数据不会变异太多或根本不变。在我的情况下(创建某种CRUD应用程序)是不值得推荐的,只需使用对象结束一切正常。问题是,如果你上传一个包含数组的json文件,firebase会将其转换为一个对象结构,使用整数作为数组中每个元素的键。然后当我开始删除元素并达到这一点时:
if (!opt_exportFormat && allIntegerKeys && maxKey < 2 * numKeys) {
// convert to array.
var array = [];
for (var key in obj)
array[key] = obj[key];
return array;
} else {
if (opt_exportFormat && !this.getPriority().isEmpty()) {
obj['.priority'] = this.getPriority().val();
}
return obj;
}
删除特定数量的元素后,代码传递给语句的else部分,最终导致firebase返回一个创建整个问题的对象。
我最终得到了这种结构:
{
"users":
{
"user_00": {
"id": 0,
"name": "Toma Broome"
},
"user_01": {
"id": 1,
"name": "Boyd Bolens"
}
}
}
使用lodash循环遍历对象(或者它可能是 for in 循环)我能够以与我在做的时候相同的方式获取数据使用数组。最后使用了一个对象结构,我没有更多带有未定义元素的集合。
@cartant,非常感谢!!!我肯定会对你的评论有所了解。我希望你能发一个答案,这样我就可以把它标记为问题的解决方案并提出它,你先生就赢了!