2016-11-29 93 views
1

我試圖排序包含以字符串格式(DD-MMM-YY)日期的陣列,使用sort()功能:排序含有日 - 月 - 年的格式日期陣列

var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"]; 

array.sort(function(a, b) { 
    return new Date(a).getTime() - new Date(b).getTime(); 
}); 

但是,沒有成功。

這裏怎麼回事? Here is the JSFiddle

編輯:雖然排序問題通過小的更正解決,但主要問題是跨瀏覽器支持,下面的許多答案有不同的解決方案。

+5

這些都不是有效的日期 – adeneo

+2

'了'和'B'是字符串,你期待什麼'a.date'和'b.date'成爲? – Teemu

+0

對不起,這是一個錯誤@Teemu!它將是'a'和'b'而不是屬性訪問器。謝謝! – Rishabh

回答

3

您可以拆分日期字符串併爲月份值使用對象。

此建議首先按年份排序,然後按月份排序,然後按日期排序。

var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"], 
 
    MONTHS = { jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12 }; 
 

 
array.sort(function (a, b) { 
 
    var aa = a.split('-'), 
 
     bb = b.split('-'); 
 

 
    return aa[2] - bb[2] || MONTHS[aa[1]] - MONTHS[bb[1]] || aa[0] - bb[0]; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

2

這些都不是有效的日期,與琴絃有沒有date屬性,所以每樣迭代只是比較NaN代替日期

某些瀏覽器可能能夠解析1-jun-15 ,但它是不是符合IETF標準的日期,並且不能保證JavaScript引擎會知道如何處理該日期t格式。事實上,在IE和Firefox中進行的一些測試顯示,它們無法一起解析這種格式,而Chrome瀏覽器對它沒有任何問題,這就是爲什麼一個符合標準的日期或多個參數總是應該傳遞給new Date

你必須自己

var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"]; 
 

 
var months = [ 
 
\t "jan", "feb","mar","apr","may","jun","jul","aug","sep","oct","nov", "dec" 
 
]; 
 

 
function parse(date) { 
 
    var parts = date.split('-'); 
 
    return new Date('20'+parts[2], months.indexOf(parts[1]), parts[0]); 
 
} 
 

 
array.sort(function(a, b) { 
 
    return parse(a).getTime() - parse(b).getTime(); 
 
}); 
 

 
console.log(array);

0

一個簡單的方法是將日期轉換成Unix的時間戳,對它們進行排序,然後再轉換回你原來的日期解析日期格式。那麼你不必擔心在幾個月內進行字符串比較。

2

您試圖在比較器中獲取abdate屬性,但它只是一個字符串。所以你需要解析它(Date.parse(a)或只是new Date(a))。

這裏是固定的jsfiddle

0

您需要將日期字符串轉換爲有效日期,然後比較時間戳。

var array = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"]; 
 
const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun'] 
 

 
const strToDate = str => { 
 
    const params = str.split('-') 
 
    params[0] = parseInt(params[0]) 
 
    params[1] = months.indexOf(params[1]) 
 
    params[2] = parseInt(params[2]) + 2000 
 
    return new Date(...params.reverse()) 
 
    
 
} 
 
array.sort(function(a, b) { 
 
    return strToDate(a).getTime() - strToDate(b).getTime(); 
 
}); 
 

 
console.log(array)

1

您需要三個步驟:

  1. 轉換日期
  2. 排序日期
  3. 轉換的日期再次

工作例如:

var dateArray = ["1-jun-15", "1-feb-15", "1-apr-15", "1-may-15", "1-jan-15", "1-mar-15"]; 
 

 
console.log(dateArray); 
 

 
// STEP ONE - CONVERT THE ARRAY ITEMS 
 

 
for (var i = 0; i < dateArray.length; i++) { 
 

 
    var tempDateArray = dateArray[i].split('-'); 
 

 
// Convert the year into a 4-digit number 
 

 
    var year = '20' + tempDateArray[2]; 
 

 
// Convert the month into a 2-digit number 
 

 
    var month = tempDateArray[1]; 
 

 
    switch(month) { 
 
     case ('jan') : month = '01'; break; 
 
     case ('feb') : month = '02'; break; 
 
     case ('mar') : month = '03'; break; 
 
     case ('apr') : month = '04'; break; 
 
     case ('may') : month = '05'; break; 
 
     case ('jun') : month = '06'; break; 
 
     case ('jul') : month = '07'; break; 
 
     case ('aug') : month = '08'; break; 
 
     case ('sep') : month = '09'; break; 
 
     case ('oct') : month = '10'; break; 
 
     case ('nov') : month = '11'; break; 
 
     case ('dec') : month = '12'; break; 
 
    } 
 

 
// Convert the date into a 2-digit number 
 

 
    var date = tempDateArray[0]; 
 

 
    if (date < 2) { 
 
     date = '0' + date; 
 
    } 
 

 
// Recreate each array item as an 8-digit integer 
 

 
dateArray[i] = year + month + date; 
 

 
} 
 

 
console.log(dateArray); 
 

 

 
// STEP TWO - SORT THE ARRAY ITEMS 
 

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

 
console.log(dateArray); 
 

 

 
// STEP THREE - CONVERT THE ARRAY ITEMS BACK AGAIN 
 

 
for (var i = 0; i < dateArray.length; i++) { 
 

 
    // Convert the date back again 
 

 
    var date = dateArray[i].substring(6); 
 

 
    if (date.substring(0,1) === '0') { 
 
     var date = date.substring(1); 
 
    } 
 

 

 
    // Convert the month back again 
 

 
    var month = dateArray[i].substring(4,6); 
 

 
    switch(month) { 
 
     case ('01') : month = 'jan'; break; 
 
     case ('02') : month = 'feb'; break; 
 
     case ('03') : month = 'mar'; break; 
 
     case ('04') : month = 'apr'; break; 
 
     case ('05') : month = 'may'; break; 
 
     case ('06') : month = 'jun'; break; 
 
     case ('07') : month = 'jul'; break; 
 
     case ('08') : month = 'aug'; break; 
 
     case ('09') : month = 'sep'; break; 
 
     case ('10') : month = 'oct'; break; 
 
     case ('11') : month = 'nov'; break; 
 
     case ('12') : month = 'dec'; break; 
 
    } 
 

 

 
    // Convert the year back again 
 

 
    var year = dateArray[i].substring(2,4); 
 

 
    dateArray[i] = date + '-' + month + '-' + year; 
 

 
} 
 

 
console.log(dateArray);

相關問題