我正在拨打电话以获取books
的清单,该清单已通过此电话在Firebase中设置
firebase.database().ref('/users/' + uid + '/books').on('value', (data) => {
this.books = data.val();
})
虽然数据以对象的形式返回,但其中包含书本对象。我需要它们以数组形式,因为我的表需要一个数组来显示数据。有没有办法在不变换数据的情况下以数组形式返回它?我预计列表会很长,因此转换数据最终似乎会成为性能问题。
答案 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进行了新调用,然后将结果附加到您的书本状态。因此,您应该使用“一次”而不是“开”,以确保仅在需要时才获得新书,并且不会在整个节点上收听更改。