JavaScript - 使用Firebase

时间:2016-05-29 18:00:24

标签: javascript arrays sorting firebase

我不确定是否由于升级到新控制台而发生了这种情况,或者它是否一直发生,但我发现我的代码中有一个错误,其中的数字按此顺序排列:

1, 12, 2, 21, 3, 33, 4

所以,如果我做这样的事情:

ref.orderByKey().startAt(1).endAt(20).on("value", function);
// Returns: 1, 12, 2
// Desired result: 1, 2, 3, 4, 12

请注意,为了便于阅读,我使用了较小的数字,实际上我使用了像2016-4-13这样的日期字符串,这就是为什么它们是字符串。

是否有解决方案,或者我将不得不决定牺牲查询或密钥可读性?

更多信息: 数据从大量日期列表中获取一组日期。 startAt和endAt的唯一原因是限制用户下载的数量。例如,从某个时间开始一周。

代码示例

ref.orderByKey().startAt("2016-4-5").endAt("2016-4-11").on("value", function(snapshot){
   //returns null
 });

数据

  {
  "GroupOne" : {
    "2015-11-1" : {
      "simplelogin:75" : 5.4,
      "simplelogin:77" : 5.5,
      "simplelogin:80" : 5.5
    },
    "2015-11-2" : {
      "simplelogin:75" : 5.4,
      "simplelogin:77" : 5.6,
      "simplelogin:80" : 5.9
    },
    "2015-11-22" : {
      "simplelogin:24" : 2.1
    },
    "2015-11-3" : {
      "simplelogin:77" : 3,
      "simplelogin:80" : 0.2
    },
    "2015-11-31" : {
      "simplelogin:77" : 15.8
    },
    "2015-11-4" : {
      "simplelogin:77" : 5.1,
      "simplelogin:80" : 0.3
    },
    "2015-11-5" : {
      "simplelogin:77" : 3.8
    },
    "2015-11-6" : {
      "simplelogin:75" : 0.1
    },
    "2016-0-1" : {
      "simplelogin:77" : 13.1
    },
    "2016-0-10" : {
      "simplelogin:75" : 3
    },
    "2016-0-11" : {
      "simplelogin:75" : 3
    },
    "2016-0-12" : {
      "48506d5c-319e-4f47-a29f-c47d6ed82a17" : 3.8,
      "simplelogin:75" : 3.2
    },
    "2016-0-22" : {
      "simplelogin:78" : 1
    },
    "2016-0-5" : {
      "simplelogin:80" : 3
    },
    "2016-0-8" : {
      "simplelogin:24" : 0.9,
      "simplelogin:77" : 3.2
    },
    "2016-1-23" : {
      "simplelogin:75" : 3.1
    },
    "2016-1-27" : {
      "simplelogin:75" : 6.3
    },
    "2016-1-28" : {
      "simplelogin:75" : 12.2
    },
    "2016-2-15" : {
      "simplelogin:75" : 1
    },
    "2016-2-2" : {
      "simplelogin:75" : 5.1
    },
    "2016-2-22" : {
      "simplelogin:75" : 1,
      "simplelogin:78" : 1,
      "simplelogin:80" : 1
    },
    "2016-2-23" : {
      "simplelogin:75" : 4.3
    },
    "2016-2-24" : {
      "simplelogin:75" : 5.7
    },
    "2016-2-25" : {
      "simplelogin:75" : 1
    },
    "2016-2-26" : {
      "simplelogin:75" : 2
    },
    "2016-2-27" : {
      "simplelogin:75" : 1
    },
    "2016-2-28" : {
      "simplelogin:75" : 1
    },
    "2016-2-30" : {
      "simplelogin:75" : 6
    },
    "2016-3-1" : {
      "simplelogin:75" : 2,
      "simplelogin:77" : 2
    },
    "2016-3-11" : {
      "simplelogin:75" : 8.6,
      "simplelogin:80" : 0.9
    },
    "2016-3-12" : {
      "simplelogin:75" : 1
    },
    "2016-3-14" : {
      "simplelogin:75" : 3.8
    },
    "2016-3-6" : {
      "simplelogin:77" : 13.2
    },
    "2016-4-10" : {
      "simplelogin:75" : 2
    },
    "2016-4-15" : {
      "simplelogin:75" : 1
    },
    "2016-4-25" : {
      "simplelogin:75" : 1
    },
    "2016-4-5" : {
      "simplelogin:75" : 6
    }
  }
}

2 个答案:

答案 0 :(得分:1)

由于字符串是严格格式化的,因此alpha排序会为你做正确的事情,假设它是yyyy-mm-dd,所以字段的重要性是正确的顺序。

答案 1 :(得分:0)

JavaScript排序不按数字顺序排列。它的工作原理更符合字母顺序。

要按值排序,您必须传入参数



var result = document.getElementById("result");

var numbers = [1, 12, 2, 21, 3, 33, 4];

var sorted = numbers.filter(function(number) {
    return number >= 1 && number <= 20;
}).sort(function(a,b) { return a - b });

result.innerHTML = sorted;
&#13;
<p id="result"></p>
&#13;
&#13;
&#13;

以下是有关Array.prototype.sort

的文档

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

看起来Firebase的orderbyKey()方法有这种类型的实现。这可以解释订单。

  

使用 orderByKey()对数据进行排序时,数据将按键名称按升序返回,如下所示。请注意,键只能是字符串

https://www.firebase.com/docs/web/guide/retrieving-data.html#section-ordered-data

我无法找到此功能的源代码,因此我建议不要使用它并使用我的方法。

相关问题