簡體   English   中英

日期和升序降序的JavaScript排序函數

[英]JavaScript Sort Function with Descending Dates and Ascending Times

有了這些數據,我的排序函數將按升序,升序和名字的字母順序排序:

[
  ['Kurt Asdf', '25 Nov 2017 4:30 PM'],
  ['Vincent Qwerty', '25 Nov 2017 4:30 PM'],
  ['Zed Jones', '24 Nov 2017 2:00 PM'],
  ['Jack Mo', '25 Nov 2017 5:00 PM'],
  ['John Phil', '25 Nov 2017 4:00 PM'],
  ['Bob Phil', '25 Nov 2017 4:00 PM']
]

這是我當前排序功能的輸出(以下代碼):

[
  ['Zed Jones', '24 Nov 2017 2:00 PM'],
  ['Bob Phil', '25 Nov 2017 4:00 PM'],
  ['John Phil', '25 Nov 2017 4:00 PM'],
  ['Kurt Asdf', '25 Nov 2017 4:30 PM'],
  ['Vincent Qwerty', '25 Nov 2017 4:30 PM'],
  ['Jack Mo', '25 Nov 2017 5:00 PM']
]

這是我想要的輸出:

[
  ['Bob Phil', '25 Nov 2017 4:00 PM'],
  ['John Phil', '25 Nov 2017 4:00 PM'],
  ['Kurt Asdf', '25 Nov 2017 4:30 PM'],
  ['Vincent Qwerty', '25 Nov 2017 4:30 PM'],
  ['Jack Mo', '25 Nov 2017 5:00 PM'],
  ['Zed Jones', '24 Nov 2017 2:00 PM']
]

請注意,在上面的輸出中,日期是按降序排列的,而時間是按升序排列的,並且每個時隙內的字母順序保持不變。

這是我嘗試過的:

function sortTable(data) {
  return data.sort((elem1, elem2) => {
    var dateA         = new Date(elem1[1])
      , dateB         = new Date(elem2[1])
      , nameA         = elem1[0]
      , nameB         = elem2[0]
      , datecomp      = dateB-dateA;

    if (nameA === undefined || nameB === undefined)
      namecomp = 0;
    else
      namecomp = nameA[0] > nameB[0] || -(nameA[0] < nameB[0]);

    return datecomp > 0 ? datecomp : datecomp + namecomp;
  });
}

您可以使用鏈式方法以不同的排序順序對零件進行排序。

我建議使用單個函數來比較和返回訂單。

您可以使用ISO 8601字符串對日期降序和時間升序進行排序。 以后按名稱升序排序。

為什么要使用ISO 8601日期/時間字符串?

的轉換

 25 Nov 2017 4:30 PM 

返回格式為的可排序字符串

 2017-11-25T15:30:00.000Z ISO in GMT ^^^^^^^^^^ date ^^^^^^^^ time without milli seconds 

由此,我們將日期部分用於降序排序

 2017-11-25 

和時間部分

 15:30:00 

如果日期相同,則升序排序。

在此處閱讀更多內容: 排序ISO 8601日期向前或向后

 var array = [['Kurt Asdf', '25 Nov 2017 4:30 PM'], ['Vincent Qwerty', '25 Nov 2017 4:30 PM'], ['Zed Jones', '24 Nov 2017 2:00 PM'], ['Jack Mo', '25 Nov 2017 5:00 PM'], ['John Phil', '25 Nov 2017 4:00 PM'], ['Bob Phil', '25 Nov 2017 4:00 PM']]; array.sort(function (a, b) { function compare(a, b) { return a > b || -(a < b); } var aISO = new Date(a[1]).toISOString(), bISO = new Date(b[1]).toISOString(); return compare(bISO.slice(0, 10), aISO.slice(0, 10)) // date desc || compare(aISO.slice(11, 19), bISO.slice(11, 19)) // time asc || compare(a[0], b[0]); // name asc }); console.log(array); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

我建議保持可讀性是將日期分為日期和時間,以便分別比較它們:

// number of milliseconds in a day = 24 * 3600 * 1000 = 24 * 36e5
millis = date.getTime()
time = millis % (24 * 36e5)
day = millis - time

JavaScript日期精確度以毫秒為單位,因此date.getTime()給出自1970-01-01以來經過的毫秒數。 這是我會做的:

 var dates = [ new Date(2017, 0, 1, 0, 0, 1), new Date(2017, 0, 2, 0, 0, 2), new Date(2017, 0, 3, 0, 0, 1), new Date(2017, 0, 2, 0, 0, 1), new Date(2017, 0, 3, 0, 0, 2), new Date(2017, 0, 1, 0, 0, 2) ]; dates.sort(function (date1, date2) { var millisInADay = 24 * 36e5; var millis1 = date1.getTime(); var millis2 = date2.getTime(); var time1 = millis1 % millisInADay; var time2 = millis2 % millisInADay; var day1 = millis1 - time1; var day2 = millis2 - time2; if (day1 < day2) return 1; if (day1 > day2) return -1; if (time1 > time2) return 1; if (time1 < time2) return -1; return 0; }); dates.forEach(function (date) { console.log(date.toLocaleString()); }); 

這是使用您自己的數據表的結果:

 var table = [ ['Kurt Asdf', '25 Nov 2017 4:30 PM'], ['Vincent Qwerty', '25 Nov 2017 4:30 PM'], ['Zed Jones', '24 Nov 2017 2:00 PM'], ['Jack Mo', '25 Nov 2017 5:00 PM'], ['John Phil', '25 Nov 2017 4:00 PM'], ['Bob Phil', '25 Nov 2017 4:00 PM'] ]; table.sort(function (x1, x2) { var millisInADay = 24 * 36e5; var name1 = x1[0]; var name2 = x2[0]; var date1 = new Date(x1[1]); var date2 = new Date(x2[1]); var millis1 = date1.getTime(); var millis2 = date2.getTime(); var time1 = millis1 % millisInADay; var time2 = millis2 % millisInADay; var day1 = millis1 - time1; var day2 = millis2 - time2; if (day1 < day2) return 1; if (day1 > day2) return -1; if (time1 > time2) return 1; if (time1 < time2) return -1; if (name1 > name2) return 1; if (name1 < name2) return -1; return 0; }); table.forEach(function (x) { var date = new Date(x[1]); console.log(date.toLocaleString(), "|", x[0]); }); 

暫無
暫無

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

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