Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase在删除后返回具有未定义对象的数组_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase在删除后返回具有未定义对象的数组

Javascript Firebase在删除后返回具有未定义对象的数组,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,从Firebase数据库中删除元素时出现问题。结构如下(仅为示例): 我正在获取用户列表连接如下: firebase.database().ref("/users/").on("value", snap => { users = snap.val(); console.log( users ); // pay attention to this line usersLoop(); }); 然后我在屏幕上渲染元素,并尝试删除其中一个: firebase.databa

从Firebase数据库中删除元素时出现问题。结构如下(仅为示例):

我正在获取用户列表连接如下:

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控制台,该元素实际上会从数据库中删除,但是用户数组包含
未定义的
值,删除一些元素后,它返回一个对象而不是数组

这是删除数据库第一个位置的三个元素后的控制台。我的意思是,我得到了完整的用户列表(我正在使用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

@cartant提供的链接给出了答案

是的,firebase确实容忍其数据中的数组结构,但不建议使用它们,除非特定数据不会发生太多或根本不会发生变化。在我的情况下(创建某种CRUD应用程序)是不可取的,只需使用对象结束一切都可以。问题是,如果上载一个包含数组的json文件,firebase将使用整数作为数组中每个元素的键将其转换为对象结构。然后当我开始删除元素并达到这一点时:

使用lodash在对象中循环(或者对于in循环,它可能是一个),我能够以与使用数组时相同的方式获取数据。最后使用一个对象结构,我没有得到任何包含未定义元素的集合


@卡坦特,非常感谢!!!通过你的评论,我确实学到了一些东西。我希望你能发布一个答案,这样我就可以把它标记为问题的解决方案并投票表决,先生,这是你应得的

Firebase既不存储也不返回数组:@cartant虽然您认为Firebase不存储数组是正确的,但在许多情况下,它会返回一个存储值数组,看起来像一个数组。但是删除项目会把事情搞砸。事实上,这个问题中的情况在博客文章中的片段“然而,如果我们随后删除a、b和d”中有明确的说明。如果其他人对“看起来像数组”的意思感兴趣,请看一下。如果你能接受自己的答案;这很好地解释了这种情况。我很高兴这些链接对我有所帮助。
-users
 |-0
  |-id:0
  |-name:value
  |-otherprops:value
 |-1
  |-id:1
  |-name:value
  |-otherprops:value
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;
}
{
  "users":
  {
    "user_00": {
      "id": 0,
      "name": "Toma Broome"
    },
    "user_01": {
      "id": 1,
      "name": "Boyd Bolens"
    }
  }
}