根据Firebase文档:
push()生成的唯一名称以a为前缀 客户端生成的时间戳,以便生成结果列表 按时间顺序排序。
那么当我从通过push
创建所有子节点的节点检索列表时,如何将此对象转换为按时间顺序排序的数组?在AngularFire中,有一个$ asArray()方法似乎为你做了这个。如果没有AngularFire,我怎么能这样做?
我想要做的代码示例是:
var ref = new Firebase('https://your.firebaseio.com/')
ref.on('value', function(snap){
var obj = snap.val()
console.log(obj)
/*
obj looks like: {-JeHAy0QO5jhCAecc-Ha: {name: "item 1"} ..}.
I'd like to loop through this collection in
chronology order, but in JS, one should not rely on the order that key values
come while using a for-in loop. So I figured that instead, I probably need
to transform it into an array first then use a regular for loop.
Therefore, I'd like to transform obj into an array:
[{name: 'item 1'}, {name: 'item 2'}, ..]
where the order of the array is chronologically ordered (ie somehow decode
and use the keys of obj to sort the object). How do I do this?
*/
})
1 {/ 1}}下的script.js
下的
答案 0 :(得分:4)
如果您尝试按照键的顺序将所有子项放入数组中,则可以使用DataSnapshot's forEach
method:
ref.on('value', function(snap){
var children = [];
snap.forEach(function(child) {
children.push(child.val());
});
console.log(children.length);
forEach
数组将以正确的顺序包含所有子项。
但请注意,每次添加/删除任何子项或修改任何现有子项时,都会触发此操作。如果您使用此数组来构建HTML DOM,则每次都会重新绘制整个集合。
这就是为什么Firebase还会针对特定孩子发起事件:child_added
,child_changed
,child_removed
和child_moved
。 on
的签名定义为:
on()
-on(eventType, callback, [cancelCallback], [context])
回调函数记录为:
发生指定事件时触发的回调。回调将传递给DataSnapshot。出于订购目的,“child_added”,“child_changed”和“child_moved”也将按优先级顺序传递包含前一个子项的键的字符串(如果它是第一个子项,则返回null)。
因此,使用previousChild
参数,您还可以重建正确的顺序(您只需自己完成)。
有关更多信息,请参阅Firebase documentation on these events。