【问题标题】:How to sort an array of dates stringified in YYYY-M format?如何对以 YYYY-M 格式字符串化的日期数组进行排序?
【发布时间】:2014-12-09 11:14:51
【问题描述】:

我有一个包含如下字符串的数组:

["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"]

我正在尝试对它们进行排序,使它们看起来像:

["2013-1", "2013-2", "2013-3", "2013-4", "2013-10", "2013-11", "2013-12", "2014-1", "2014-2", "2014-3"]

我已经查看了很多关于这个主题的主题,但没有一个解决方案对我有用。

使用this question's answer 我的数组根本没有改变。

var myArray =  ["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"]
    myArray.sort(function(a,b) {
      if (isNaN(a) || isNaN(b)) {
        return a > b ? 1 : -1;
      }
      return a - b;
    });

似乎找不到轻松做到这一点的方法,有什么想法可以实现吗?

【问题讨论】:

    标签: jquery arrays sorting


    【解决方案1】:

    问题在于它不仅仅是字符串数组中的数字,每个字符串中有两个数字。有许多可能的方法,您可以将值解析为日期,您可以将值解析为两个数字,您可以将值拆分为字符串和数字,等等。

    我建议的方法是将每个字符串转换为可排序以进行比较的格式,即将"2013-1" 之类的字符串转换为2013-01。由于字符串中的每个组件具有相同的长度,并且组件的重要性下降,您可以将它们作为字符串进行比较:

    myArray.sort(function(a,b) {
      var x = a.replace(/(-\d$)/, '-0$1');
      var y = b.replace(/(-\d$)/, '-0$1');
      return (
        x > y ? 1 :
        x < y ? -1 :
        0
      );
    });
    

    var myArray = ["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"];
    
    myArray.sort(function(a,b) {
      var x = a.replace(/(-\d$)/, '-0$1');
      var y = b.replace(/(-\d$)/, '-0$1');
      return (
        x > y ? 1 :
        x < y ? -1 :
        0
      );
    });
    
    // output result in StackOverflow snippet
    document.write(JSON.stringify(myArray));

    【讨论】:

    • 如果你在return中使用过x.localeCompare(y)会更简单。
    【解决方案2】:

    其中一种方法:

    myArray.sort(function (a, b) {
        a = a.split("-");
        b = b.split("-");
        var montha = parseInt(a[1]),
            monthb = parseInt(b[1]);
        a = parseInt(a[0]);
        b = parseInt(b[0]);
        if (a === b) {
            return (montha - monthb);
        }
        return a - b;
    });
    

    See DEMO here.

    【讨论】:

      【解决方案3】:

      这是一种函数式编程方法:将字符串映射到两个数字的数组,对该数组进行排序(更容易),然后映射回字符串。

      var input = ["2013-1", "2013-10", "2013-11", "2013-12", "2013-2", "2013-3", "2013-4", "2014-1", "2014-2", "2014-3"];
      var output = input
        .map(function (val) {
          return val.split("-").map(Number);
        })
        .sort(function (a, b) {
          return a[0] - b[0] || a[1] - b[1];
        })
        .map(function (val) {
          return val.join("-");
        });
      

      演示:http://jsbin.com/fekiruzose/2/edit?js,console

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-13
        • 1970-01-01
        • 2021-07-30
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 2019-10-29
        • 2015-08-21
        相关资源
        最近更新 更多