【问题标题】:Sorting String Date Array in ascending and Descending Order按升序和降序对字符串日期数组进行排序
【发布时间】:2014-03-26 12:23:41
【问题描述】:

以下代码:

var dateArr = new Array();
dateArr[0] = "11-12-2012";
dateArr[1] = "9-12-2014";
dateArr[2] = "11-12-2012";
dateArr[3] = "9-12-2011";

必须按升序和降序对上述字符串日期数组进行排序。请任何人给我一些建议,并提供解决相同问题的示例。 提前致谢。

【问题讨论】:

  • 循环遍历元素,将每个元素转换为日期对象,然后sort them

标签: javascript jquery arrays sorting


【解决方案1】:

试试-

var arr = [];
for(var i =0; i<dateArr.length; i++)
{
    date1 = dateArr[i].split("-");
    if(date1[0]<10){date1[0]='0'+date1[0]} 
    if(date1[1]<10){date1[1]='0'+date1[1]} 
    arr.push(new Date(date1[2], date1[1] - 1, date1[0]));
}

arr.sort(function(a,b){return a-b});  //asc
console.log(formatDateArr(arr));

arr.sort(function(a,b){return b-a});  //desc
console.log(formatDateArr(arr));

function formatDateArr(arr)
{
    formatedArr = [];
    for(var i=0; i<arr.length; i++)
    {
        var curr_date = arr[i].getDate();
        var curr_month = arr[i].getMonth() + 1; //Months are zero based
        var curr_year = arr[i].getFullYear();
        formatedArr.push(curr_date + "-" + curr_month + "-" + curr_year);
    }
    return formatedArr;
} 

arr 将是排序后的日期数组。

JSFiddle

【讨论】:

  • 感谢您的回复。这就是我要找的。但是当我在 Chrome 上运行它们时,它工作正常。但是当在 Mozilla 中运行相同的代码时,它会显示以下结果: ["NaN-NaN-NaN", "NaN-NaN-NaN", "NaN-NaN-NaN", "NaN-NaN-NaN"] 你能请帮我整理一下
  • 是的,实际上 firefox 不会创建格式为 DD-MM-YYYY 的日期,因此我们必须先对其进行一些格式化,然后再将其转换为日期对象。我已经编辑了小提琴链接和答案,请检查!
【解决方案2】:

这是未经测试的代码,但答案如下所示:


dateArr.sort(function(d1,d2) {
    var year1 = d1.substr(6,4);
    var year2 = d2.substr(6,4);
    if (year1 < year2) return -1;
    if (year1 > year2) return 1;

    var month1 = d1.substr(3,2);
    var month2 = d2.substr(3,2);
    if (month1 < month2) return -1;
    if (month1 > month2) return 1;

    if (d1 < d2) return -1;
    if (d1 > d2) return 1;
    return 0;
});

我不记得 -1 还是 1 是升序还是降序,所以可能需要调换一下。

编辑:等一下,这行不通,因为有些日期的字符数不是正好 10 个。因此,您必须对“-”字符进行字符搜索(“indexOf()”方法),并在 .substr 方法中使用这些索引,而不是盲目的 6,4 或 3,2

【讨论】:

    【解决方案3】:

    一种方法是将时间戳映射到日期,然后对它们进行排序:

    // Array of dates in d/m/y format
    let data = ['11-12-2012', '9-12-2014', '11-12-2012', '9-12-2011'];
    
    // Map strings to Date objects
    let dates = data.map(s => {
      let [d, m, y] = s.split(/\D/);
      return new Date(y, m-1, d);
    });
    
    // Sort
    dates.sort((a, b) => a - b);
    
    // Show sorted array
    dates.forEach(d => console.log(d.toDateString()))

    另一种方法是将字符串映射到可排序的时间戳,例如ISO 8601 格式:

    // Array of dates in d/m/y format
    let data = ['11-12-2012', '9-12-2014', '11-12-2012', '9-12-2011'];
    
    // Map strings to ISO 8601 format YYYY-MM-DD
    let dates = data.map(s => {
      let [d, m, y] = s.split(/\D/);
      return `${y}-${m.padStart(2,'0')}-${d.padStart(2,'0')}`;
    });
    
    // Sort - no special sort function required
    dates.sort();
    
    // Show sorted array
    console.log(dates);

    也可以使用格式 YYYYMMDD,但我认为 YYYY-MM-DD 可能对其他进程有用。

    最后,如果目的只是对原始数组进行排序,则可以在排序函数中进行转换,但效率较低,因为在排序过程中每个值可能会被多次转换,例如

    // Array of dates in d/m/y format
    let data = ['11-12-2012', '9-12-2014', '11-12-2012', '9-12-2011'];
    
    // Use a sort function that sorts the original array
    data.sort((a, b) => {
      let p = s => {
        let [d, m, y] = s.split(/\D/);
        return new Date(y, m-1, d);
      };
      return p(a) - p(b);
    });
    
    // Show sorted array
    console.log(data);

    同样的方法也可以使用重新格式化的字符串方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      相关资源
      最近更新 更多