Deepu Sasidharan
Deepu Sasidharan

Reputation: 5309

Smallest date from nested json using jquery

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

Answers (4)

nnnnnn
nnnnnn

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

Jatin patil
Jatin patil

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

Rana Ghosh
Rana Ghosh

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

RAHUL S R
RAHUL S R

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

Related Questions