2012-06-05 63 views
0

我正在使用大量jQuery UI控件特別是datepicker的asp.net應用程序。循環播放對象數組

在我的web服務我正在對數據庫的調用和檢索對象的列表,然後通過他們回到我的javascript,我分析出來到含有1個或多個對象,看起來像這樣的數組:

javascript object http://s7.postimage.org/9nsq80rnv/JSON_object.png

我需要包括某種邏輯,其中,我可以循環通過該陣列對象,並檢查是否一個JavaScript日期對象的結束日期和開始日期屬性之間落在這樣我可以應用一個DatePicker的css風格。第一個問題,有沒有辦法將EndDate/StartDate屬性從此格式轉換爲有效的javascript日期? 如果是的話,我該如何迭代數組並應用邏輯來查看日期是否在範圍內?

任何幫助,非常感謝!

編輯:我注意到這裏的圖像是一種難以看到可以更清晰地讀到這裏的屬性:

image link

由於這裏要求是一些示例代碼:

function createDateRangesForCalendar() { 
    $.ajax({ 
     type: "POST", 
     url: "../Services/BookingService.asmx/GetCalendarDateRanges", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, 
     success: function (response) { 
      dateRanges = $.parseJSON(response.d); 
     }, 
     error: function (xhr, textStatus, thrownError) { 
      alert(textStatus); 
      alert(thrownError); 
     } 
    }); 
} 

function markInvalidDates(date) { 

    var isHoliday = false; 
    dmy = date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear(); 

    isHoliday = checkIsHoliday(date); 

    if ($.inArray(dmy, invalidDays) == -1) { 

     for (var i = 0; i < dateRanges.length; i++) { 
      // if date falls in between start and end date of object[i] return something like: return [true, "holiday", "Holiday Rates Apply - Minimum 14 days"]; 
      // else loop through to the next object and try there 
      } 

     if (isHoliday == true) { 
      return [true, "holiday", "Holiday Rates Apply - Minimum 14 days"]; 
     } else { 
      return [true, ""]; 
     } 
    } else { 
     return [false, "unavailable", "Unavailable"]; 
    } 
} 
+0

如果放大一些,圖像會更好 –

+0

你有任何代碼嗎? –

+0

因此,你有一個開始和結束日期,你在比較它們是什麼? – Claude

回答

2

第一個問題,有沒有辦法從這種格式的結束日期/ startDate屬性轉換爲有效的JavaScript日期?

格式似乎是這樣的:/Date(MILLISECONDS)/。有效的JS日期對象可以像這樣獲得:new Date(s.match(/Date\((\d+)/)[1])

如果是的話我怎麼能迭代這個數組和運用邏輯看,如果日期落在範圍之內?

var re = /Date\((\d+)/; 
for(var i in arr) { 
    var start = new Date(arr[i].startDate.match(re)[1]), 
     end = new Date(arr[i].endDate.match(re)[1]); 
    if(myDate < end && myDate > start) 
     // do something. 
} 

以上似乎回答你的問題,我的理解方式。

+0

這看起來很有希望。我現在必須離開學校,但我一回到家就會嘗試,並告訴你是否成功。 –

+0

嘿,我只是嘗試了你的方法,我開始和結束都無效的日期,可能是因爲正則表達式不是剝離所有不必要的字符?我會做一些調查,看看我能否弄清楚。對不起,我的js很脆弱我確定它非常簡單。除此之外,一切都看起來像它的順序。 –

+0

嗯....我扔了一些斷點,你的正則表達式絕對正確地解析出只有毫秒值,但我仍然得到一個無效的日期,當我呼籲新的日期()。 –

2

StartDate和EndDate對我來說看起來像是有效的JSON,除了結尾和開始處的斜線。否則,一個簡單的值的評估應該產生一個JS日期對象,你可以在其上操作。

對於你的第二點,是什麼讓你從經典的循環遍歷數組?有些代碼會說更多的話更有用。

+0

'eval()'是邪惡的 – Claude

+0

是的,大多數情況下,但不適用於受控環境。現在,我知道這不是一個受控制的環境,而只是說。 –

+2

@克勞德:確實。比方說,JSON.parse() – RomainVALERI

2

只需將您的開始日期和結束日期作爲數字返回,而不使用\ Date()\ wrappers。

在你的循環,從你的目標日期創建一個JavaScript日期,即new Date(1334548800000)然後用你的目標日期以及那些開始和結束日期之間的簡單比較。

雖然你可以循環使用$.each(yourArray, function(id,item){ date comparison logic here });,我建議你看看下劃線庫體面的工具集來操縱JS對象。

+0

+1表示下劃線! –

+0

如果可以避免,我寧願不這樣做,因爲我只是在我的C#web方法中使用JavaScript序列化程序來打包對象列表,我不得不寫一個新的類來處理您正在談論的內容。但我一定會考慮下劃線。 –