Jesse Carter
Jesse Carter

Reputation: 21147

Looping over array of objects

I'm working on an asp.net app that is utilizing a lot of jQuery UI controls particularly the datepicker.

In my web service I am making a call to the database and retrieving a list of objects and then passing them back to my javascript where I parse them out into an array containing 1 or more objects that look like this:

javascript object

I need to include some kind of logic in which I can loop through this array of objects and check to see if a javascript Date falls in between the EndDate and StartDate properties of the object so that I can apply a css style for the DatePicker. First question, is there a way to convert the EndDate/StartDate property from this format to a valid javascript Date? And if so how can I iterate over the array and apply the logic to see if the date falls inside the range?

Any help is greatly appreciated!

Edit: I noticed the image here is kind of hard to see you can more clearly read the properties here:

image link

As requested here is some example code:

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"];
    }
}

Upvotes: 0

Views: 299

Answers (3)

Butifarra
Butifarra

Reputation: 1114

Just return your start and end dates as numerics, without the \Date()\ wrappers.

In your loop, create a JavaScript date from your target date, i.e. new Date(1334548800000) then use simple comparisons between your target date and those start and end dates.

While you can loop with $.each(yourArray, function(id,item){ date comparison logic here }); I recommend you look into the Underscore library for a decent set of utilities to manipulate JS objects.

Upvotes: 2

Parth Thakkar
Parth Thakkar

Reputation: 5475

First question, is there a way to convert the EndDate/StartDate property from this format to a valid javascript Date?

The format seems to be this: /Date(MILLISECONDS)/. A valid JS date object can be obtained like this: new Date(s.match(/Date\((\d+)/)[1]).

And if so how can I iterate over the array and apply the logic to see if the date falls inside the range?

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.
}

The above seems to answer your question, the way I understand it.

Upvotes: 2

Romain Valeri
Romain Valeri

Reputation: 21998

StartDate and EndDate seem like valid JSON to me, except for the slashes at end and beginning. Otherwise, a simple eval of the value should produce a JS Date Object on which you can operate.

For your second point, what keeps you from classic looping over the array ? Some code would be much more useful to say more.

Upvotes: 2

Related Questions