对日期为JavaScript的字符串数组进行排序

时间:2016-06-23 16:08:09

标签: javascript jquery arrays

我尝试过使用underscorejs,minmax方法,但它们无法处理字符串。无论如何,从我读过和学到的东西,因为我从两者都得到了infinite

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

我怎样才能抓住这些中的最后一个和第一个日期?

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

8 个答案:

答案 0 :(得分:7)

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"  
]

答案 1 :(得分:1)

如果我们可以使用特定格式格式化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 ];

答案 2 :(得分:0)

为了更容易进行子请求操作,请将格式更改为:YYYY / MM / DD。 这样定期排序可以正确地获得最小值和最大值,并且您不需要进一步解析。 帮助函数排序将是这样的:

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

答案 3 :(得分:0)

  

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 :(得分:0)

我知道这样做的一种方法是使用.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是最晚的日期

答案 5 :(得分:0)

很多人已经谈过这个问题,但您需要将日期字符串转换为可在sort函数中进行比较的内容。我没见过的一件事就是如何获得第一个和最后一个日期。这应该可以解决问题:

//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)

答案 6 :(得分:0)

您可以使用Array#reduce,因为您只需要两个值,这可以通过一个循环来实现。

&#13;
&#13;
var dates = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"],
    values = dates.reduce(function (r, a, i) {
        function getISO(s) { return s.replace(/(.+)\/(.+)\/(.+)/, '$3$2$1'); }
        if (!i) {
            return { min: a, max: a };
        }
        if (getISO(a) < getISO(r.min)) {
            r.min = a;
        }
        if (getISO(a) > getISO(r.max)) {
            r.max = a;
        }
        return r;
    }, {});

console.log(values);
&#13;
&#13;
&#13;

答案 7 :(得分:0)

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 对象/函数,它们以非常相似的方式工作。