簡體   English   中英

在Javascript中按日期對數組進行排序

[英]Sort array by date in Javascript

我正在使用sort()按日期排序數組

elements = data.sort(function(a, b) {
    return a.date.getTime() - b.date.getTime()
});

問題是某些元素缺少日期(或日期無效),並導致此錯誤:

無法讀取未定義的屬性“ getTime”

更新:我現在可以使用了

我應該在哪里檢查日期是否為有效日期,然后使用它對數組進行排序?

更新:這是我的數據

[{
        "date": "2019-06-15 14:57:13",
        "user": "john"
    },
    {
        "date": "2019-06-15 05:48:01",
        "user": "mike"
    },
    {
        "date": "bad-date-format",
        "user": "donna"
    },
    {
        "date": "2019-06-08 10:45:09",
        "user": "Ismil"
    },
    {
        "date": "",
        "user": "Daniel17"
    }
]

這是我期望的輸出

[
    {
        "date": "2019-06-15 14:57:13",
        "user": "john"
    },
    {
        "date": "2019-06-15 05:48:01",
        "user": "mike"
    },
    {
        "date": "2019-06-08 10:45:09",
        "user": "Ismil"
    },
    {
        "date": "bad-date-format",
        "user": "donna"
    },
    {
        "date": "",
        "user": "Daniel17"
    }
]

您可以檢查屬性是否存在,是否具有所需的格式,然后按字符串降序對日期進行排序,如果格式無效,則取布爾值的差值。

 function checkDate(string) { return typeof string === 'string' && /\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}/.test(string); } var array = [{ date: "2019-06-15 14:57:13", user: "john" }, { date: "2019-06-15 05:48:01", user: "mike" }, { date: "bad-date-format", user: "donna" }, { date: "2019-06-08 10:45:09", user: "Ismil" }, { date: "", user: "Daniel17" }]; array.sort((a, b) => { var aC = checkDate(a.date), bC = checkDate(b.date); return aC && bC ? b.date.localeCompare(a.date) : bC - aC; }); console.log(array); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

根據OP評論

按日期降序排列,沒有損壞數據的應該放在數組的開頭

 let data = [{ date: new Date('2019-01-03T00:00:00.000Z') },{ date: new Date('2020-01-03T00:00:00.000Z') },{ date: new Date('2018-01-03T00:00:00.000Z') }, {}] function safeGetTime(obj) { if (obj && obj.date && obj.date.getTime) { return obj.date.getTime(); } return Number.MAX_SAFE_INTEGER; // replace with `return 0` to put invalid data at end of array } data.sort(function(a, b) { return safeGetTime(b) - safeGetTime(a) }); console.log(data); 

您可以使用Date.parse來確保您有一個有效的日期,並且對兩個參數都進行排序時。 否則,將有效日期排序為“較高”的數字排序:

 let data = [{ "date": "2019-06-15 14:57:13", "user": "john" }, { "date": "2019-06-15 05:48:01", "user": "mike" }, { "date": "bad-date-format", "user": "donna" }, { "date": "2019-06-08 10:45:09", "user": "Ismil" }, { "date": "", "user": "Daniel17" } ] let result = data.sort((a,b) => Date.parse(a.date) && Date.parse(b.date) ? new Date(b.date).getTime() - new Date(a.date).getTime() : Date.parse(a.date) ? -1 : 0 ) console.log(result) 

您不必檢查字符串是否為有效日期。

這是一個工作代碼:

 const data = [{ "date": "2019-06-15 14:57:13", "user": "john" }, { "date": "2019-06-15 05:48:01", "user": "mike" }, { "date": "bad-date-format", "user": "donna" }, { "date": "2019-06-08 10:45:09", "user": "Ismil" }, { "date": "", "user": "Daniel17" } ]; const elements = data.sort((a, b) => (new Date(b.date).getTime() || -Infinity) - (new Date(a.date).getTime() || -Infinity)); console.log(elements); 

上面代碼背后的技巧是,如果將無效的日期字符串傳遞給它,則new Date()將給出一個Invalid Date對象;如果執行了它的getTime()方法,它將返回NaN

現在,因為您希望所有Invalid Date都在底部,所以排序函數應該將這些Invalid Date視為數組中評分最低的,這就是-Infinite意思(最低的數字。如果您向其中添加任何數字,將導致-Infinite )。

我認為如何在數組底部對Invalid Date排序是沒有關系的。

 data.sort(function(a, b) { if (typeof a.date !== 'undefined' && typeof b.date !== 'undefined') { return a.date.getTime() - b.date.getTime() } return 0 }); 

工作簡單的例子

 data = [{date:"100"},{date:null},{date:"1"}, {nodate:"10"}]; data.sort(function(a, b) { if (typeof a.date !== 'undefined' && typeof b.date !== 'undefined') { return a.date - b.date } return 0 }); console.log(data) 

您可以使用&&運算符。

data.sort(function(a, b) {
    return (a.date && b.date && a.date.getTime && b.date.getTime && a.date.getTime() - b.date.getTime()) || 0
});

我希望有一個輔助功能。

const validDate = (...arr) => arr.every(x => x.date && x.date.getTime);
data.sort(function(a, b) {
    return (validDate(a,b) && a.date.getTime() - b.date.getTime()) || 0
});

您可以在使用getTime之前檢查

 let data = [{ date: new Date('2019-01-03T00:00:00.000Z') },{ date: new Date('2020-01-03T00:00:00.000Z') },{ date: new Date('2018-01-03T00:00:00.000Z') }, {}] data.sort((a, b)=>{ if(!isNaN(new Date(a.date).getTime()) && !isNaN(new Date(b.date).getTime())){ return a.date.getTime() - b.date.getTime() } return Infinity }); console.log(data); 

暫無
暫無

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

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