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

时间:2017-01-11 12:34:21

标签: javascript sorting firebase firebase-realtime-database

我找到了这个方法,我已经订购了我在记录中存储的小时数,我希望它们从最高到最低排序,但是当我测试代码时,我注意到只有两个数组的值是比较,这是第一批寄存器。

我见过其他比较方法,逻辑是一样的,我做错了什么?我将每个用户的消息分组,使用用户的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数据库的图片

enter image description here

2 个答案:

答案 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创建的时间戳的负值。