【问题标题】:How to sort date strings (format example: 2014 7 23) in JavaScript?如何在 JavaScript 中对日期字符串(格式示例:2014 7 23)进行排序?
【发布时间】:2015-01-27 09:11:31
【问题描述】:

在 JavaScript 中,我试图按日期对一组对象进行排序,每个对象都有一个日期,但我遇到了障碍。日期也是从网站上的 3 个下拉框中输入的,所以我只需要 3 个数字。这意味着我不能使用 JavaScript 的 Date() 对象,因为它还添加了时间、时区并以字母等形式写入月份名称。

示例: 我将 5 个对象添加到数组中。我尝试过使用 JavaScript 排序功能,具体来说这是一个:

array.sort(function(a, b) {
    if(a.date == b.date){
        return 0;
    }
    else if (a.date < b.date){
        return 1;
    } 
     else {
        return -1;
    }
})

但是,这仅按年份排序。

所以如果我添加: 2014 7 12 2017 年 8 月 16 日 2017 4 14 2017 1 31 2017 2 26

我得到: 2014 7 12 2017 2 26 2017 年 8 月 16 日 2017 1 31 2017 年 4 月 14 日

这是我用来制作不同 Label 对象的构造函数。

function Label(name, date, type) {
this.name = name;
this.date = date;
this.type = type;

}

var a = new Label("name1", "2016 5 16", 5);
var b = new Label("name2", "2016 7 20", 3);
var c = new Label("name3", "2016 3 15", 2);

我的日期属性只是一个字符串中的 3 个数字。所以我尝试将排序函数重写为:

    array.sort(function(a,b){
        a = a.date.split(" ");
        b = b.date.split(" ");
        if(a[0] === b[0] && a[1] === b[1] && a[2] === a[2]){
            return 0;
        }
        else if ((a[0] > b[0]) || (a[0] === b[0] && a[1] > b[1]) || (a[0] === b[0] && a[1] === b[1] && a[2] > b[2])){
            return -1;
        } 
        else {
            return 1;
        }
    });

即我尝试使用 .split 函数来分隔 3 个数字,然后将它们存储在一个数组中。然后为日期 a 分配 3 个数字的数组,日期 b 也是如此。然后我检查两个数组中的值是否相等,如果相等,则返回 0(什么也不做)。 如果数组 a 中的年份大于数组 b 中的年份,则在输出数组中将其下移 1 个空格。 如果年份相等,则检查月份。如果 a 中的月份大于 b 中的月份,则在输出数组中向下移动 1 个空格。 等等。

但是这不会发生。它基本上给了我相同的输出,只是按年份排序,但忽略了月份和日期。

我检查了几个类似的 StackOverflow 问题,但大多数都使用 Date() 对象。 我特别需要“数字数字”的格式。

为什么我的函数不起作用,我该如何让它起作用?

编辑:通过日期和构造函数的示例使我的帖子更加清晰。

【问题讨论】:

    标签: javascript arrays sorting date


    【解决方案1】:

    看起来日期格式始终与您已经拆分等相同,您应该使用日期对象并改为比较它们

    array.sort(function(a,b){
        var arr1 = a.date.split(" ");
        var arr2 = b.date.split(" ");
    
        var time1 = new Date(arr1[0], arr1[1]-1, arr1[2]); // year, month, day
        var time2 = new Date(arr2[0], arr2[1]-1, arr2[2]);
    
        return time1 - time2;
    });
    

    【讨论】:

    • 难道你不应该使用Date对象的getTime方法来正确获取毫秒时间戳值吗?
    • 另外,这对代码排序似乎效率很低
    • 可以直接比较日期对象,效率可能不高,但必须将字符串转换为日期对象才能正确比较。
    • @adeneo 嗯,我明白了,但为什么你在这里放一个 -1 :arr1[1]-1, arr2[1]-1 而不是在年和日?
    • 因为在 javascript 中月份是从零开始的。
    【解决方案2】:

    首先,让我们整理一下。

    • Javascript Date 对象存储为自基准以来的毫秒数,当您将它们输出到字符串时,它们很可能有毫秒、时区信息等,但这与它们的内部无关。
    • 您的排序功能是一种过于复杂的方式,仅用于执行a.date - b.date

    因此,您要做的是将属性作为实际的Date 对象,并使用排序功能

    var sortedArray = array.sort(function(a, b) {
      a.date - b.date;
    });
    

    【讨论】:

      【解决方案3】:

      请使用 javascript 的日期对象并执行以下排序:

      array.sort(function(a, b) {
          return a.date.getTime()-b.date.getTime();
      });
      

      【讨论】:

        猜你喜欢
        • 2013-01-05
        • 2021-03-08
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多