删除后,Firebase会返回带有未定义对象的数组

时间:2017-07-03 23:25:05

标签: javascript firebase firebase-realtime-database

我从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

1 个答案:

答案 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,非常感谢!!!我肯定会对你的评论有所了解。我希望你能发一个答案,这样我就可以把它标记为问题的解决方案并提出它,你先生就赢了!