Arya220
Arya220

Reputation: 105

Finding minimum and maximum date in an complex json array

I have a json array like this.

var data=[
{
    Title:"Dummy1",
    Events:[{
    eventName:"StartDate"
    Date:"Jan-2014"
    },
    {
    eventName:"EndDate"
    Date:"Feb-2015"
    }]
},
{
    Title:"Dummy2",
    Events:[{
    eventName:"StartDate"
    Date:"Jan-2013"
    },
    {
    eventName:"EndDate"
    Date:"Feb-2015"
    }]
},
{
    Title:"Dummy3",
    Events:[{
    eventName:"StartDate"
    Date:"Feb-2014"
    },
    {
    eventName:"EndDate"
    Date:"Mar-2015"
    }]
}];

Please notice that dates are not date objects as such. they are strings.

I need to find the minimum of StartDate and maximum of EndDate So the result should be

MinStartDate:Jan-2013
MaxEndDate:Mar-2015

I would prefer to use angular if not javascript or jquery is also fine.

thanks in advance.

Upvotes: 0

Views: 1898

Answers (3)

Faruk Omar
Faruk Omar

Reputation: 1193

I created a function called dataSort() and sorted the data array ASC OR DESC order. Since I sorted the array by a field so it's easy to pick a minimum or maximum value.

<script>
var data = [
    {
        Title: "Dummy1",
        Events: [{
            eventName: "StartDate",
            Date: "Jan-2014"
        },
            {
                eventName: "EndDate",
                Date: "Feb-2015"
            }]
    },
    {
        Title: "Dummy2",
        Events: [{
            eventName: "StartDate",
            Date: "Jan-2013"
        },
            {
                eventName: "EndDate",
                Date: "Feb-2015"
            }]
    },
    {
        Title: "Dummy3",
        Events: [{
            eventName: "StartDate",
            Date: "Feb-2014"
        },
            {
                eventName: "EndDate",
                Date: "Mar-2015"
            }]
    }];


function dataSort(jsonData, orderBy, order) {
    var index = 0; // 0 StartDate
    if (orderBy == 'EndDate') {
        index = 1; // 1  EndDate
    }

    jsonData.sort(function (a, b) {

        var ad = a.Events[index].Date;
        ad = ad.replace(new RegExp('-'), '1, ')
        aStartdate = new Date(Date.parse(ad));


        var bd = b.Events[index].Date;
        bd = bd.replace(new RegExp('-'), '1, ')
        bStartdate = new Date(Date.parse(bd));
        if (order == 'ASC') {
            return aStartdate - bStartdate; // asc
        } else {
            return bStartdate - aStartdate; // desc
        }


    });

    return jsonData;
}


var dataSortByStartDate = dataSort(data, 'StartDate', 'ASC');
var MinStartDate = dataSortByStartDate[0].Events[0].Date;
console.log('MinStartDate: ' + MinStartDate);

var dataSortByEndDate = dataSort(data, 'EndDate', 'DESC');
var MaxEndDate = dataSortByEndDate[0].Events[1].Date;
console.log('MaxEndDate: ' + MaxEndDate);

Upvotes: 0

Stubbies
Stubbies

Reputation: 3124

Here's another approach using Math

var data=[
{
    Title:"Dummy1",
    Events:[{
    eventName:"StartDate",
    Date:"Jan-2014"
    },
    {
    eventName:"EndDate",
    Date:"Feb-2015"
    }]
},
{
    Title:"Dummy2",
    Events:[{
    eventName:"StartDate",
    Date:"Jan-2013"
    },
    {
    eventName:"EndDate",
    Date:"Feb-2015"
    }]
},
{
    Title:"Dummy3",
    Events:[{
    eventName:"StartDate",
    Date:"Feb-2014"
    },
    {
    eventName:"EndDate",
    Date:"Mar-2015"
    }]
}];

var startDates = [],
    endDates = [];

for (i = 0; i < data.length; i++) {
  startDates.push(Date.parse(data[i].Events[0].Date));
  endDates.push(Date.parse(data[i].Events[1].Date));
  
}

Array.min = function( array ){
return Math.min.apply( Math, array );
};

Array.max = function( array ){
return Math.max.apply( Math, array );
};

// or use a library like Moment.js to format dates
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];


var minDate = new Date(Array.min(startDates)),
    minDateFormat = months[minDate.getMonth()]+'-'+minDate.getFullYear();

var maxDate = new Date(Array.max(endDates)),
    maxDateFormat = months[maxDate.getMonth()]+'-'+maxDate.getFullYear();



console.log(minDateFormat );
console.log(maxDateFormat);

Upvotes: 1

Jax Teller
Jax Teller

Reputation: 1467

There is my solution, this is a bit long, but very easy to understand and edit for any update. I'm sure we can solve it with 4-5 lines, but whatever, it works.

First, define a month array :

var month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

Like every time you need to search min/max in an array, you need to initialize min and max with the first value :

var max_end_date = data[0].Events[1].Date;
var min_start_date = data[0].Events[0].Date;

And then, split every date for compare year / month for start en end, and you have a result like this :

$.each(data, function(k, v) {
    var month_min_start_date = min_start_date.split("-")[0];
    var year_min_start_date = min_start_date.split("-")[1];

    var current_start_date = v.Events[0].Date;
    var month_current_start_date = current_start_date.split("-")[0];
    var year_current_start_date = current_start_date.split("-")[1];

    if (year_current_start_date < year_min_start_date 
        || year_current_start_date == year_min_start_date && month.indexOf(month_current_start_date) < month.indexOf(month_min_start_date)) {
            min_start_date = current_start_date;
        }

    var month_max_end_date = max_end_date.split("-")[0];
    var year_max_end_date = max_end_date.split("-")[1];

    var current_end_date = v.Events[1].Date;
    var month_current_end_date = current_end_date.split("-")[0];
    var year_current_end_date = current_end_date.split("-")[1];

    if (year_current_end_date > year_max_end_date 
        || year_current_end_date == year_max_end_date && month.indexOf(month_current_end_date) > month.indexOf(month_max_end_date)) {
            max_end_date = current_end_date;
        }

})

You can try it on JSFiddle

Upvotes: 2

Related Questions