Reputation: 5309
I have a json string
{
"name":"experience",
"spans":[
{"start":"2013-01-01","end":"2015-12-31","name":"Medical emergency","className":"gap","color":"red"},
{"start":"2017-03-01","end":"2017-03-16","name":"Test reason","className":"gap","color":"red"},
{"start":"2010-06-01","end":"2012-20-01","name":"Newtech Media","className":"career","color":"green"},
{"start":"2016-01-01","end":"2017-03-01","name":"Exlog Technologies","className":"career","color":"green"},
{"start":"2009-01-01","end":"2009-20-01","name":"Infosys","className":"career","color":"green"}
]
}
I converted the above json string to json object using
var timeObj = $.parseJSON(data);
Now I want the smallest
start date
. That is from the above string, it is 2009-01-01.
How can I get the smallest date from the nested json object?
I tried a lot but not get the exact. I think someone can help me..
Upvotes: 1
Views: 130
Reputation: 150030
The array .reduce()
method is a pretty handy way of finding the smallest/largest/coolest item in an array, because you only need one line of code:
smallest = timeObj.spans.reduce(function(a,b) { return a.start < b.start ? a : b }).start
Noting that comparing the dates as strings with <
works with YYYY-MM-DD
format*, but if they were in some other format you would to need to parse them first.
The only other thing is you need to allow for the case where the array might be empty, so maybe something like this:
var json = `{
"name":"experience",
"spans":[
{"start":"2013-01-01","end":"2015-12-31","name":"Medical emergency","className":"gap","color":"red"},
{"start":"2017-03-01","end":"2017-03-16","name":"Test reason","className":"gap","color":"red"},
{"start":"2010-06-01","end":"2012-20-01","name":"Newtech Media","className":"career","color":"green"},
{"start":"2016-01-01","end":"2017-03-01","name":"Exlog Technologies","className":"career","color":"green"},
{"start":"2009-01-01","end":"2009-20-01","name":"Infosys","className":"career","color":"green"}
]
}`
var timeObj = JSON.parse(json)
// ensure array isn't empty before trying to reduce it
var smallestDate = timeObj.spans.length == 0
? null
: timeObj.spans.reduce(function(a,b) {
return a.start < b.start ? a : b
}).start
console.log(smallestDate)
*Although I notice your end dates seem to be a mix of YYYY-MM-DD
and YYYY-DD-MM
, so you probably should fix that.
Upvotes: 0
Reputation: 4288
var data = {
"name":"experience",
"spans":[
{"start":"2013-01-01","end":"2015-12-31","name":"Medical emergency","className":"gap","color":"red"},
{"start":"2017-03-01","end":"2017-03-16","name":"Test reason","className":"gap","color":"red"},
{"start":"2010-06-01","end":"2012-20-01","name":"Newtech Media","className":"career","color":"green"},
{"start":"2016-01-01","end":"2017-03-01","name":"Exlog Technologies","className":"career","color":"green"},
{"start":"2009-01-01","end":"2009-20-01","name":"Infosys","className":"career","color":"green"}
]
};
var dateArray = data.spans.map(function(item) {
return new Date(item.start);
});
dateArray.sort(function(a, b) {
return a - b;
});
var lowestDate = dateArray[0];
console.log(lowestDate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
EDITED BELOW IF YOU WANT TO RETAIN IT'S FORMAT
var data = {
"name":"experience",
"spans":[
{"start":"2013-01-01","end":"2015-12-31","name":"Medical emergency","className":"gap","color":"red"},
{"start":"2017-03-01","end":"2017-03-16","name":"Test reason","className":"gap","color":"red"},
{"start":"2010-06-01","end":"2012-20-01","name":"Newtech Media","className":"career","color":"green"},
{"start":"2016-01-01","end":"2017-03-01","name":"Exlog Technologies","className":"career","color":"green"},
{"start":"2009-01-01","end":"2009-20-01","name":"Infosys","className":"career","color":"green"}
]
};
var dateArray = data.spans.map(function(item) {
return item.start;
});
dateArray.sort(function(a, b) {
return new Date(a) - new Date(b);
});
var lowestDate = dateArray[0];
console.log(lowestDate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Upvotes: 4
Reputation: 4674
$(document).ready(function (e) {
var string = '{"name":"experience", "spans":[{"start":"2013-01-01","end":"2015-12-31","name":"Medical emergency","className":"gap","color":"red"}, {"start":"2017-03-01","end":"2017-03-16","name":"Test reason","className":"gap","color":"red"}, {"start":"2010-06-01","end":"2012-20-01","name":"Newtech Media","className":"career","color":"green"}, {"start":"2016-01-01","end":"2017-03-01","name":"Exlog Technologies","className":"career","color":"green"}, {"start":"2009-01-01","end":"2009-20-01","name":"Infosys","className":"career","color":"green"}]}';
var timeObj = $.parseJSON(string);
var smallest = new Date(timeObj.spans[0].start);
$.each(timeObj.spans, function(index, value){
var temp = new Date(value.start);
if(smallest > temp)
{
smallest = temp;
}
});
console.log(smallest);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Upvotes: 0
Reputation: 1579
not exactly correct format but it should be something like this
var smallDate = new DateTime(data.spans[0].start);
$(data.spans).each(function(){
var tempDate = new DateTime($this.start);
if(tempDate < smallDate)
{
smallDate =tempDate;
}
})
//smallDate will have th smallet date among the object
Upvotes: 0