2012-11-26 133 views
0

我想看看我的數組中的項目是否是今天創建的,所以我使用arrayFilter來過濾數組中的每個元素,問題是,我無法讓我的過濾器工作正確:在Javascript中比較日期字符串

return ko.utils.arrayFilter(self.enquiries(), function (enquiry) { 
    var include = true; 

    if (self.onlyToday()) { 
     var formatted = $.datepicker.formatDate("dd/mm/yy", new Date()); 

     include = include && +enquiry.EnquiryDate.indexOf(+formatted > -1); 
    } 

    return include; 
}); 

這裏是我的數據是這樣的:

formatted: 26/11/2012 
enquiry.EnquiryDate: 08/11/2012 08:46:46 

所以很明顯,因爲它不是今天創造了這個enquiry應該被過濾。

回答

2

這裏有幾個問題。

  1. 你投入formatted一個字符串,然後再使用+formatted > -1+formatted將永遠是NaN,這永遠不會是> -1(它也永遠不會等於-1,從來沒有< -1)。

  2. 您正在設置includetrue,然後是include = include && ...&&之後的部分將不會被評估,因爲&&左邊的部分是true和JavaScript(與大多數現代語言一樣)的短路表達式。

  3. 如果enquiry所指的對象,+enquiry可能會是NaN除非你重寫它的valueOf

  4. 你比較,這意味着比較的最顯著的部分將是在左邊  —但你的日期字符串的格式,其中最顯著值都在。因此,例如,在"01/01/2013"比的"02/02/2012",儘管當然這不是他們所代表的日期的真實的。如果你想有意義地比較日期字符串,他們必須有左邊的一年,然後是一個月,然後是一天。上述

    var today = $.datepicker.formatDate("yy/mm/dd", new Date()); 
    return ko.utils.arrayFilter(self.enquiries(), function (enquiry) { 
        var parts, enqDate; 
    
        parts = enquiry.EnquiryDate.split(' ')[0].split('/'); 
        enqDate = parts[2] + '/' + parts[1] + '/' + parts[0]; 
        return enqDate === today; 
    }); 
    

    注:

根據您的報價enquiry.EnquiryDate字符串,你可以做到這一點

  • 注意,我得到今天的日期與一年左邊。

  • 我已經刪除了self.onlyToday()位,因爲如果self.onlyToday()爲假,過濾器沒有執行任何操作。我的猜測是你想要在這個過濾器函數之外進行檢查,並且你要麼調用這個過濾器,要麼不要。

  • 由於enquiry.EnquiryDate是日期時間字符串,用空格隔開,第一我們將其上的空間中,那麼我們就所述第一部分(日期)和拆分它的/。然後我們按yy/mm/dd的順序重新組合。

  • 現在我們知道我們可以對字符串執行===以查看詢問日期是否等於今天。

你可以,當然,做使用Date對象這種比較,但你只需要在enquiry.EnquiryDate字符串解析爲Date對象,無論如何,你只需要一天的分辨率(不毫秒的分辨率),使用字符串比較似乎是合理的。