Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript对Firebase中的数据进行排序,如何比较对象数组中的所有寄存器?_Javascript_Sorting_Firebase_Firebase Realtime Database - Fatal编程技术网

使用JavaScript对Firebase中的数据进行排序,如何比较对象数组中的所有寄存器?

使用JavaScript对Firebase中的数据进行排序,如何比较对象数组中的所有寄存器?,javascript,sorting,firebase,firebase-realtime-database,Javascript,Sorting,Firebase,Firebase Realtime Database,我发现了这个方法,我用它对存储在记录中的小时数进行了排序,我希望它们从最高到最低排序,但是当我测试代码时,我注意到只比较了数组的两个值,即第一个寄存器 我见过其他的比较方法,逻辑是一样的,我做错了什么?我将每个用户的消息分组,使用用户的id作为数组的键,然后保存其余的数据。我这样做是为了检索当前消息,因为我想显示最近发送的消息的列表 代码如下: var ref = new Firebase('https://chatfbexample.firebaseio.com/all-messages');

我发现了这个方法,我用它对存储在记录中的小时数进行了排序,我希望它们从最高到最低排序,但是当我测试代码时,我注意到只比较了数组的两个值,即第一个寄存器

我见过其他的比较方法,逻辑是一样的,我做错了什么?我将每个用户的消息分组,使用用户的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']);
    }
});
var ref=new Firebase('https://chatfbexample.firebaseio.com/all-messages');
参考“值”,功能(快照){
var消息=[];
var值=0;
snapshot.forEach(函数(snap){
value=snap.val().id;
fecha=snap.val().id;
消息[值]=[];
Messages[value]['fecha']=snap.val().fechahora;//我收到一个格式为HH:MM:SS的日期
Messages[value]['texto']=snap.val().texto;
});
功能比较(a、b){
var time1=a['fecha']。替换(/:/gi,'1');
var time2=b['fecha']。替换(/:/gi,'1');
var data1=parseInt(time1);
var data2=parseInt(time2);
//警报(时间1);
如果(数据1>数据2)
返回-1;
如果(数据1<数据2)
返回1;
返回0;
}
消息。排序(比较);
for(消息中的var i){
log(“小时:+消息[i]['fecha']+''+'消息:'+消息[i]['texto']);
}
});
结果是这样的

时间:12:11:13留言:怎么了?
时间:11:38:44消息:p
时间:11:49:01消息:嘿

第二条和第三条消息不进行比较

我的Firebase数据库的图像


与其在客户端排序,不如让服务器对邮件进行排序:

ref.orderByChild("fechahora").on(...
确保在Firebase安全规则中定义了正确的索引:

{
  "rules": {
    "all-messages": {
      ".indexOn": "fechahora"
    }
  }
}

如果没有这一点,排序将仍然有效,但将在客户端而不是服务器上进行。

首先,最好从Firebase保存时间戳,而不是在数据库中的客户端创建的实际时间。通过这种方式,您可以轻松地让Firebase处理排序

您需要使用
firebase.database.ServerValue.TIMESTAMP
来保存firebase在
fechahora
中收到您的消息的确切时间

ref.orderByChild("fechahora").on("value", function (snapshot) {
    //Do stuff with your already sorted data
}
接下来,您可以简单地查询由其子项fechahora排序的所有邮件

ref.orderByChild("fechahora").on("value", function (snapshot) {
    //Do stuff with your already sorted data
}
如果希望查询具有更好的性能,请将包含Firebase数据库规则中所有消息的节点的
.indexOn
属性设置为
fechahora


额外好处:如果您希望将数据从最新到最旧排序,而不是从最旧到最新排序,则只需使用Firebase创建的时间戳的负值。

您的消息不是数组,而是对象。您好,Mathew,是的,我了解到了这一点,但出于某种原因,排序只适用于前两个元素,我如何解决这个问题?我必须转换数组中的对象才能管理它?你能提供一些Firebase数据库的示例数据吗?hi@hotrod我编辑了帖子并上传了数据库的图像,你现在可以看到它,只有三条记录,但按id分组。你想让你的邮件从最新到最旧排序吗?谢谢hotrod,事实上,我决定这样做是因为firebase只从最早到最新排列数据,我读到了时间戳,但我不理解负值,我怎么能得到它?太好了,我已经标记了答案,你的问题是这个吗?不,是这样的:检查我的
prepareUpload()
方法。它是用
Java
编写的,但我想你仍然可以看到我在那里做什么。