我找到了这个方法,我已经订购了我在记录中存储的小时数,我希望它们从最高到最低排序,但是当我测试代码时,我注意到只有两个数组的值是比较,这是第一批寄存器。
我见过其他比较方法,逻辑是一样的,我做错了什么?我将每个用户的消息分组,使用用户的id作为数组的密钥,然后保存其余的数据。我这样做是为了检索当前消息,因为我想显示最后发送的当前消息的列表。
这是代码:
var ref = new Firebase('https://chatfbexample.firebaseio.com/all-messages');
ref.on("value", function (snapshot) {
var Messages = [];
var value = 0;
snapshot.forEach(function (snap) {
value = snap.val().id;
fecha = snap.val().id;
Messages[value] = [];
Messages[value]['fecha'] = snap.val().fechahora; //I receive a date with the format HH:MM:SS
Messages[value]['texto'] = snap.val().texto;
});
function compare(a, b) {
var time1 = a['fecha'].replace(/:/gi, '1');
var time2 = b['fecha'].replace(/:/gi, '1');
var data1 = parseInt(time1);
var data2 = parseInt(time2);
// alert(time1);
if (data1 > data2)
return -1;
if (data1 < data2)
return 1;
return 0;
}
Messages.sort(compare);
for (var i in Messages) {
console.log("Hour: " + Messages[i]['fecha'] + ' ' + ' Message: ' + Messages[i]['texto']);
}
});
结果是这样的
小时:12:11:13消息:什么时候? 时间:11:38:44消息:p
时间:11:49:01消息:嘿?
第二条和第三条消息未被比较
我的Firebase数据库的图片
答案 0 :(得分:0)
不要在客户端订购,最好让服务器对消息进行排序:
ref.orderByChild("fechahora").on(...
确保在Firebase安全规则中定义正确的索引:
{
"rules": {
"all-messages": {
".indexOn": "fechahora"
}
}
}
如果不这样,排序仍然有效,但会在客户端而不是服务器上进行。
答案 1 :(得分:0)
首先,您可能最好从Firebase保存时间戳,而不是在数据库内的客户端创建的实际时间。这样您就可以轻松让Firebase处理排序。
您需要使用firebase.database.ServerValue.TIMESTAMP
来保存Firebase在fechahora
内收到邮件的确切时间。
您可以简单地查询他们的孩子fechahora
订购的所有邮件。
ref.orderByChild("fechahora").on("value", function (snapshot) {
//Do stuff with your already sorted data
}
如果您希望查询具有更好的性能,请将包含Firebase数据库规则中所有邮件的节点的.indexOn
属性设置为fechahora
。
奖励:如果您希望数据从最新到最旧而不是从最旧到最新排序,则只需使用Firebase创建的时间戳的负值。