2017-09-01 49 views
1

JavaScript數組:如何排序與鑑於以下陣列多datetime列

var effectiveDates= [ 
    { 
     actualDate: "2017-08-29", 
     effectiveDate: "2017-01-01", 
     time: "13:22" 
    }, 
    { 
     actualDate: "2017-08-29", 
     effectiveDate: "2017-01-01", 
     time: "11:33" 
    }, 
    { 
     actualDate: "2017-08-29", 
     effectiveDate: "2017-01-01", 
     time: "10:57" 
    }, 
    { 
     actualDate: "2016-06-17", 
     effectiveDate: "2016-01-01", 
     time: "10:26" 
    }, 
    { 
     actualDate: "2016-06-17", 
     effectiveDate: "2016-01-01", 
     time: "10:03" 
    }, 
    { 
     actualDate: "2015-12-03", 
     effectiveDate: "2015-01-01", 
     time: "16:54" 
    }, 
    { 
     actualDate: "2014-07-07", 
     effectiveDate: "2014-05-01", 
     time: "10:47" 
    }, 
    { 
     actualDate: "2014-07-07", 
     effectiveDate: "2014-05-01", 
     time: "10:41" 
    }, 
    { 
     actualDate: "2014-07-07", 
     effectiveDate: "2014-01-01", 
     time: "10:36" 
    }, 
    { 
     actualDate: "2014-07-07", 
     effectiveDate: "2014-01-01", 
     time: "10:36" 
    } 
] 

我想基於actualDateeffectiveDate下降(或上升取決於量級)對數據進行排序,然後按時間(也可根據所需訂單升序或降序)。我遇到的問題是日期順序正確,但time屬性沒有正確排序。我正在使用moment.js進行日期和時間分析。

這是我迄今爲止嘗試:

var desc = true; //false; 
effectiveDates.sort(function (a, b) { 
      if (desc) { 
       if (moment(a.actualDate) === moment(b.actualDate)) { 
        return (moment(b.time) - moment(a.time)); 
       } else if (moment(a.actualDate) < moment(b.actualDate)) { 
        return 1; 
       } else if (moment(a.actualDate) > moment(b.actualDate)) { 
        return -1; 
       } 
      } 
      else { 
       if (moment(a.actualDate) === moment(b.actualDate)) { 
        return (moment(b.time) - moment(a.time)); 
       } else if (moment(a.actualDate) > moment(b.actualDate)) { 
        return 1; 
       } else if (moment(a.actualDate) < moment(b.actualDate)) { 
        return -1; 
       } 
      } 
     }); 

出於某種原因,通過effectiveDate升序或降序排序的數據時,time正確排序。 但是當通過actualDate訂購數據時,也可以升序或降序,time數據不正確。

任何幫助將不勝感激。

+0

相反調用'力矩(a.actualDate)'的倍的負荷,更好它們存儲在一個變量:'ADATE =時刻(a.actualDate )'等 – Cerbrus

+1

在這兩種情況下,您的時間比較都是以相同的方向進行的。 – Pointy

+0

也沒有必要爲其他....你可以只有一組,並基於desc翻轉-1或1。 – epascarello

回答

1

三個問題:

  1. 使用===比較兩個moment旨意無法正常工作;他們永遠不會平等。 Moment提供了一個.isSame函數來執行此操作。
  2. 要解析時間,您需要提供格式字符串,在這種情況下爲"HH:mm"
  3. 兩次減法需要在上升和下降之間反轉。只需翻轉訂單。

看到一個工作版本下方,指示更改的註釋:

function sorted(desc) { 
    return effectiveDates.sort(function (a, b) { 
     if (desc) { 
      // Use .isSame to compare two moments: 
      if (moment(a.actualDate).isSame(moment(b.actualDate))) { 
       // Provide a format to moment so it knows how to parse the times: 
       return moment(b.time, "HH:mm") - moment(a.time, "HH:mm"); 
      } else if (moment(a.actualDate) < moment(b.actualDate)) { 
       return 1; 
      } else if (moment(a.actualDate) > moment(b.actualDate)) { 
       return -1; 
      } 
     } 
     else { 
      if (moment(a.actualDate).isSame(moment(b.actualDate))) { 
       // Reverse the order of the subtraction when sorting ascending: 
       return moment(a.time, "HH:mm") - moment(b.time, "HH:mm"); 
      } else if (moment(a.actualDate) > moment(b.actualDate)) { 
       return 1; 
      } else if (moment(a.actualDate) < moment(b.actualDate)) { 
       return -1; 
      } 
     } 
    }); 
} 

輸出這些調用,

console.log("DESCENDING:"); 
console.log(sorted(true)); 

console.log("ASCENDING:"); 
console.log(sorted(false)); 

是:

DESCENDING: 
[ { actualDate: '2017-08-29', 
    effectiveDate: '2017-01-01', 
    time: '13:22' }, 
    { actualDate: '2017-08-29', 
    effectiveDate: '2017-01-01', 
    time: '11:33' }, 
    { actualDate: '2017-08-29', 
    effectiveDate: '2017-01-01', 
    time: '10:57' }, 
    { actualDate: '2016-06-17', 
    effectiveDate: '2016-01-01', 
    time: '10:26' }, 
    { actualDate: '2016-06-17', 
    effectiveDate: '2016-01-01', 
    time: '10:03' }, 
    { actualDate: '2015-12-03', 
    effectiveDate: '2015-01-01', 
    time: '16:54' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-05-01', 
    time: '10:47' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-05-01', 
    time: '10:41' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-01-01', 
    time: '10:36' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-01-01', 
    time: '10:36' } ] 
ASCENDING: 
[ { actualDate: '2014-07-07', 
    effectiveDate: '2014-01-01', 
    time: '10:36' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-01-01', 
    time: '10:36' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-05-01', 
    time: '10:41' }, 
    { actualDate: '2014-07-07', 
    effectiveDate: '2014-05-01', 
    time: '10:47' }, 
    { actualDate: '2015-12-03', 
    effectiveDate: '2015-01-01', 
    time: '16:54' }, 
    { actualDate: '2016-06-17', 
    effectiveDate: '2016-01-01', 
    time: '10:03' }, 
    { actualDate: '2016-06-17', 
    effectiveDate: '2016-01-01', 
    time: '10:26' }, 
    { actualDate: '2017-08-29', 
    effectiveDate: '2017-01-01', 
    time: '10:57' }, 
    { actualDate: '2017-08-29', 
    effectiveDate: '2017-01-01', 
    time: '11:33' }, 
    { actualDate: '2017-08-29', 
    effectiveDate: '2017-01-01', 
    time: '13:22' } ] 

UPDATE

更簡單的比較器功能:

function sorted(desc) { 
    return effectiveDates.sort(function (a, b) { 
     // Combine the date and time and parse them together. 
     var ret = moment(a.actualDate + " " + a.time) - moment(b.actualDate + " " + b.time); 

     // Flip the sign if we're sorting descending. 
     if (desc) { 
      ret *= -1; 
     } 

     return ret; 
    }); 
} 
2

而不是

return (moment(b.time) - moment(a.time)); 

用途:

moment(a.time, "HH:mm") - moment(b.time, "HH:mm") 

你需要告訴moment.js,輸入字符串是 「時間」 的字符串。