【问题标题】:Sort an array of strings that are dates JavaScript对日期为 JavaScript 的字符串数组进行排序
【发布时间】:2016-06-23 16:08:09
【问题描述】:

我尝试过使用 underscorejs、minmax 方法,但它们无法处理字符串。无论如何,从我所阅读和学习的内容来看,因为我从两者都收到了infinite

我的数组看起来像:dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]

如何获取这些中的最后一个日期和第一个日期?

我尝试使用sort,看起来也像:_.chain(dateData).sort().first().value(),但我取回了数组中的最后一项,而不是数组中的最后一个日期。

【问题讨论】:

  • 排序..从排序后的数组中获取第一项和最后一项..
  • @Rayon 我已经尝试过_.chain(dateData).sort().last().value(),但我取回了数组中的最后一项。不是数组中的最后一个日期。不过我可能只是愚蠢:)
  • @SmurfEkko,您需要通过编写自定义比较函数来指定排序行为。
  • @zzzzBov 所以这样做的方法是读取我数组中的每个项目并计算出前两位数字较高的数字,然后是第二位,然后是第三位?我会这样做吗?
  • @SmurfEkko,不,您会将值解析为日期,然后比较日期对象。考虑使用像 momentjs 这样的库来进行正确的日期解析。

标签: javascript jquery arrays


【解决方案1】:

var dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"];

function dateToNum(d) {
  // Convert date "26/06/2016" to 20160626
  d = d.split("/"); return Number(d[2]+d[1]+d[0]);
}

dateData.sort(function(a,b){
  return dateToNum(a) - dateToNum(b);
});

console.log( dateData );

要检索第一个、最后一个日期:

var firstDate = dateData[0];
var lastDate  = dateData[dateData.length -1];

基本上,如果您首先将所有26/06/2016 转换为日期 数字,例如20160626,您可以改为.sort() 这些数字。

所以你基本上是在排序:

20140626  
20140604  
20140513  
20140720  

导致:

[  
  "13/05/2016",  
  "04/06/2016",  
  "26/06/2016",  
  "20/07/2016"  
]

【讨论】:

  • 谢谢,这正是我要找的。我什至没有考虑过排序。我试图迭代数组中的每个项目并从那里解决。这是一个更好的方法。再次感谢!
【解决方案2】:

如果我们可以将 dateStrings 格式化为特定格式,那么将它们排序为字符串也会将它们排序为日期,例如YYYY-MM-DD。

您可以使用localeCompare 比较字符串。您可以使用以下代码对日期进行排序:

dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]

dateData.sort(function(a, b){
  var A = a.split("/");
  var B = b.split("/");
  var strA = [ A[2], A[1], A[0] ].join("/");
  var strB = [ B[2], B[1], B[0] ].join("/");
  return strA.localeCompare( strB );      
});

console.log( dateData );

排序后,您可以得到最小和最大日期:

var minDate = dateData[0];
var maxDate = dateData[ dateData.length - 1 ];

【讨论】:

    【解决方案3】:

    getTime() 方法返回对应的数值 根据世界时指定日期的时间。 Date.getTime()

    dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]
    .map(a=>a.split('/').reverse().join('/'))
    .sort((a,b)=>new Date(a).getTime() - new Date(b).getTime());
    console.log(dateData);

    【讨论】:

      【解决方案4】:

      很多人已经提到了这一点,但是您需要将日期字符串转换为可以在排序函数中进行比较的内容。我没有看到共享的一件事是如何获得第一个和最后一个日期。这应该可以解决问题:

      //original date array
      var dateData = ["04/06/2016", "13/05/2016", "20/07/2016","26/06/2016"];
      
      //map through the original array and convert the dates to js date objects
      var formattedDates = dateData.map(function(date){
          var splitDate = date.split("/")
          return new Date(splitDate[2],splitDate[1]-1,splitDate[0])
      })
      
      //sort the dates
      formattedDates.sort(function(a,b){
        // Turn your strings into dates, and then subtract them
        // to get a value that is either negative, positive, or zero.
        return new Date(a) - new Date(b);
      });
      
      //Now you can get the first and last dates:
      var firstDate = formattedDates[0]
      var lastDate = formattedDates[formattedDates.length-1];
      
      //log to check:
      console.log('first date: ', firstDate)
      console.log('last date: ', lastDate)
      

      【讨论】:

        【解决方案5】:

        我知道的一种方法是对字符串使用 .sort() 函数。 https://msdn.microsoft.com/en-us/library/4b4fbfhk(v=vs.94).aspx

        您必须将数组更改为 YYYY-MM-DD

        那么你可以有以下代码

        var dateData = ["2016/06/26", "2016/06/04", "2016/05/13", "2016/07/20"]; dateData.sort(); var first = dateData[0]; var last = dateData[dateData.length-1];

        first 是最早的日期,last 是最晚的日期

        【讨论】:

          【解决方案6】:

          为了便于后续操作,请将格式更改为:YYYY/MM/DD。 这样,常规排序将正确地为您提供最小值和最大值,并且您不需要进一步解析。 排序的辅助函数是这样的:

          for(var i=0;i<dateData.length;++i)
          {
              var split = dateData[i].split("/");
              dateData[i] = split.reverse().join("/");
          }
          

          【讨论】:

            【解决方案7】:

            Roko 的回答对我有用,并且 +1。何塞和我有类似的想法,+1...
            ...有一种更简单、更强大的方法:.valueOf()

            将日期字符串转换为数字

            const dateAsNumber = new Date(dateAsString).valueOf()
            

            JS 有一个内置的方法/函数,用于计算自某个日期以来经过的毫秒数;那是 .valueOf(),可以在 Date 对象上调用。因此,将您的日期字符串转换为 Date 对象(以“new Date()”为参数),然后转换为毫秒。

            之后,正常的 .sort() 工作正常。如下图,为方便起见:

            const arrayOfDateStrings = ["5/01/2012", "10/01/2020", "10/01/2019", "11/30/2016", "10/01/2021", "02/01/2020"];
            
            const sortedArray = arrayOfDateStrings.sort((a,b)=>new Date(a).valueOf() - new Date(b).valueOf());
            
            console.log(sortedArray);
            

            或 Moment.js 可以用来代替内置的 Date 对象/函数,其工作方式非常相似

            【讨论】:

              猜你喜欢
              • 2015-08-21
              • 2019-10-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-17
              • 1970-01-01
              • 2020-03-26
              • 1970-01-01
              相关资源
              最近更新 更多