javascript - React Native 上的 Firebase orderByChild
问题描述
我在 android 上订购列表时遇到问题。数据库 ref items/ 如下所示:
{
"11" : {
"date" : "2018-11-18 10:07:00",
"letter" : "F",
"number" : 11
},
"12" : {
"date" : "2018-11-01 14:41:00",
"letter" : "B",
"number" : 12
},
"13" : {
"date" : "2018-11-13 14:00:00",
"letter" : "C",
"number" : 13
},
"14" : {
"date" : "2019-04-22 22:15:30",
"letter" : "D",
"number" : 14
},
"15" : {
"date" : "2019-04-22 20:33:00",
"letter" : "H",
"number" : 15
},
"16" : {
"date" : "2019-04-22 19:30:00",
"letter" : "J",
"number" : 16
},
"17" : {
"date" : "2019-04-25 13:10:00",
"letter" : "G",
"number" : 17
},
"18" : {
"date" : "2019-04-25 18:00:00",
"letter" : "E",
"number" : 18
},
"19" : {
"date" : "2019-04-25 13:00:00",
"letter" : "I",
"number" : 19
},
"20" : {
"date" : "2019-04-28 12:30:00",
"letter" : "A",
"number" : 20
}
}
我如下查询它,期望结果按“字母”键排序:
firebase.database().ref('items/').orderByChild('letter').on('value', snapshot => {
let items = snapshot.val()
Object.values(items).map(i => console.log(i.number, i.letter, i.date))
})
但我得到的结果记录如下:
11 F 2018-11-18 10:07:00
12 B 2018-11-01 14:41:00
13 C 2018-11-13 14:00:00
14 D 2019-04-22 22:15:30
15 H 2019-04-22 20:33:00
16 J 2019-04-22 19:30:00
17 G 2019-04-25 13:10:00
18 E 2019-04-25 18:00:00
19 I 2019-04-25 13:00:00
20 A 2019-04-28 12:30:00
显然 orderByChild('letter') 没有得到应用。我会错过什么?
解决方案
显然,在 JavaScript 中如何处理对象存在问题,这就是为什么有一个可以使用的 snapshot.forEach 方法而不是我正在使用的 Object.values(items).map 的原因。我的听众应该是这样的:
firebase.database().ref('items/').orderByChild('letter').on('value', snapshot => {
snapshot.forEach(c => { i = c.val(); console.log(i.number, i.letter, i.date) })
})
由于 JavaScript 对象的工作方式,val() 返回的 JavaScript 对象中的数据顺序不能保证与服务器上的顺序或 child_added 事件的顺序相匹配。这就是 forEach() 派上用场的地方。它保证 DataSnapshot 的子项将按其查询顺序进行迭代。
https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach
推荐阅读
- arrays - 自动向下移动或插入单元格,因此不会出现“数组未展开,会覆盖数据”错误
- python-3.x - 从大 csv 文件中读取并将满足条件的行保存到另一个 df
- vue.js - 如何在脚本中使用 VUEX GETTERS
- figma - 在我的 figma 中,某些快捷键无法正常工作
- jq - 如何用jq输出时间戳
- javascript - 输入字段文本输入上的自定义古腾堡块错误
- java - 如何在构造函数的方法中不使用“this”
- .net - 数据视图开销
- python - 需要添加所有差异值,但针对特定的索引值范围
- dji-sdk - 如何从 dji mavic 2 企业镜像中获取热数据?