簡體   English   中英

對作為日期的字符串數組進行排序 JavaScript

[英]Sort an array of strings that are dates JavaScript

我嘗試過使用 underscorejs、 minmax方法,但它們無法處理字符串。 無論如何,從我閱讀和學習的內容來看,因為我從兩者中都得到了infinite回報。

我的數組看起來像: dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]

我怎樣才能抓住這些中的最后一個和第一個日期?

我也嘗試使用看起來像這樣的sort_.chain(dateData).sort().first().value()但我返回數組中的最后一項,而不是數組中的最后一個日期。

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

如果我們可以將 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 ];

getTime() 方法根據通用時間返回指定日期的時間對應的數值。 日期.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);

很多人已經接觸過這一點,但是您需要將日期字符串轉換為可以在 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)

為了便於后續操作,請將格式更改為:YYYY/MM/DD。 這樣,常規排序將正確地為您提供最小值和最大值,並且您不需要進一步解析。 排序的輔助函數如下所示:

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

我知道的一種方法是對字符串使用 .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];

其中第一個是最早的日期,最后一個是最晚的日期

您可以使用Array#reduce ,因為您只需要兩個值,這可以通過單個循環實現。

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

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 對象/函數,它們的工作方式非常相似

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM