Firebase:如何获取数组而不是对象

时间:2019-12-28 07:50:05

标签: javascript firebase firebase-realtime-database

我正在拨打电话以获取books的清单,该清单已通过此电话在Firebase中设置

firebase.database().ref('/users/' + uid + '/books').on('value', (data) => {
   this.books = data.val();
})

虽然数据以对象的形式返回,但其中包含书本对象。我需要它们以数组形式,因为我的表需要一个数组来显示数据。有没有办法在不变换数据的情况下以数组形式返回它?我预计列表会很长,因此转换数据最终似乎会成为性能问题。

screenshot of firebase db

2 个答案:

答案 0 :(得分:0)

遍历“对象”键,然后使用map转换为“对象数组”。

var obj = { a:  { b : 2 }, c:  { b : 2 } };

var arr_obj = Object.keys(obj).map(key => ({ [key]: obj[key] }));

console.log(arr_obj)

答案 1 :(得分:0)

Firebase实时数据库不对数组提供本机支持。参见https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html

假设您不想在服务器上将大量的书籍列表存储为数组(您肯定不想要!),则必须自己将该对象转换为数组某个地方

您可以构建自己的API来处理此问题,也可以在客户端中使用

firebase.database().ref('/users/' + uid + '/books').once('value', data => {
  const booksObject = data.val();

  if (!booksObject) {
    alert('No books!');
    return;
  }

  const booksArray = Object.values(booksObject);

  this.books = booksArray;
});

如果您收到太多书籍无法转换成数组,那么您可能还是想进行某种分页,并使用查询分别对数据库进行调用:

https://firebase.google.com/docs/database/admin/retrieve-data#section-queries

根据用户界面的样子,我可以想象您在用户滚动列表时对firebase进行了新调用,然后将结果附加到您的书本状态。因此,您应该使用“一次”而不是“开”,以确保仅在需要时才获得新书,并且不会在整个节点上收听更改。