循环遍历对象数组

时间:2012-06-05 17:09:34

标签: javascript asp.net json jquery-ui

我正在开发一个使用大量jQuery UI控件的asp.net应用程序,尤其是日期选择器。

在我的Web服务中,我正在调用数据库并检索对象列表,然后将它们传递回我的javascript,然后将其解析为包含一个或多个对象的数组,如下所示:

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

我需要包含某种逻辑,我可以在其中循环遍历此对象数组,并检查javascript Date是否落在对象的EndDate和StartDate属性之间,以便我可以为其应用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"];
    }
}

3 个答案:

答案 0 :(得分:2)

StartDate和EndDate对我来说似乎是有效的JSON,除了结尾和开头的斜杠。否则,值的简单eval应该生成一个可以操作的JS Date Object。

对于你的第二点,是什么阻止你在数组上经典循环?一些代码对于说更多内容会更有用。

答案 1 :(得分:2)

第一个问题,有没有办法将EndDate / 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.
}

以上似乎以我理解的方式回答了你的问题。

答案 2 :(得分:2)

只需将您的开始日期和结束日期作为数字返回,而不使用\ Date()\ wrappers。

在循环中,从目标日期创建JavaScript日期,即new Date(1334548800000),然后在目标日期与开始日期和结束日期之间使用简单比较。

虽然您可以使用$.each(yourArray, function(id,item){ date comparison logic here });循环,但我建议您查看Underscore库以获取一组适当的实用程序来操作JS对象。