Reputation: 105
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
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
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
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