0

I have json as follow:

  "reviews":[
    {
    "notes": "Great place, perfect location but the best part was the Staff. Thank you so much for making our trip so wonderful!",
    "date": "2015-04-18",
    "rating":{"overall": 100}
    },
    {
    "notes": "I messed up the days I was supposed to be there but they did everything they could to get me a room, which I did. The guy at the front was super nice and then drew me an entire map based off of how much time I had there in Rome. It was extremely helpful and the restaurant he recommends (a friends who you get 10% off of) had good lasagna. Great place for a really reasonable price. Also, the doors do not automatically lock for you room, so just remember to lock your door when you leave. ",
    "date": "2016-04-18",
    "rating":{"overall": 94}
    }
    ]

I am trying to get the latest date (most recent) so that I can print the associated "notes".

      function highestReview() {
        var maxNumb = [];
        for(var y = 0; y < data.reviews.length; y++){
          maxNumb.push(data.reviews[y].date);
        }
       var latestDate = new Date(Math.max.apply(null, maxNumb));
        console.log(latestDate);

      }
      highestReview();

I am getting "invalid date"

Aessandro
  • 5,517
  • 21
  • 66
  • 139

3 Answers3

1

As per the docs, If at least one of arguments cannot be converted to a number, the result is NaN And new Date(NaN) will be Invalid Date

Wrap the date string in new Date while pushing in array. When DateObject is passed through Number, numeric value representing date will be returned.

var data = {
  "reviews": [{
    "notes": "Great place, perfect location but the best part was the Staff. Thank you so much for making our trip so wonderful!",
    "date": "2015-04-18",
    "rating": {
      "overall": 100
    }
  }, {
    "notes": "I messed up the days I was supposed to be there but they did everything they could to get me a room, which I did. The guy at the front was super nice and then drew me an entire map based off of how much time I had there in Rome. It was extremely helpful and the restaurant he recommends (a friends who you get 10% off of) had good lasagna. Great place for a really reasonable price. Also, the doors do not automatically lock for you room, so just remember to lock your door when you leave. ",
    "date": "2016-04-18",
    "rating": {
      "overall": 94
    }
  }]
};

function highestReview() {
  var maxNumb = [];
  for (var y = 0; y < data.reviews.length; y++) {
    maxNumb.push(new Date(data.reviews[y].date));
  }
  var latestDate = new Date(Math.max.apply(null, maxNumb));
  console.log(latestDate);
}
highestReview();
Jed Fox
  • 2,979
  • 5
  • 28
  • 38
Rayon
  • 36,219
  • 4
  • 49
  • 76
1

You could use Array#reduce and compare the date as string, while it is an ISO date.

var data = { "reviews": [{ "notes": "Great place, perfect location but the best part was the Staff. Thank you so much for making our trip so wonderful!", "date": "2015-04-18", "rating": { "overall": 100 } }, { "notes": "I messed up the days I was supposed to be there but they did everything they could to get me a room, which I did. The guy at the front was super nice and then drew me an entire map based off of how much time I had there in Rome. It was extremely helpful and the restaurant he recommends (a friends who you get 10% off of) had good lasagna. Great place for a really reasonable price. Also, the doors do not automatically lock for you room, so just remember to lock your door when you leave. ", "date": "2016-04-18", "rating": { "overall": 94 } }] },
    latestDate = data.reviews.reduce(function (r, a, i) {
        return !i || a.date > r ? a.date : r;
    }, undefined);
    
document.write('<pre>' + JSON.stringify(latestDate, 0, 4) + '</pre>');
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
1

You must convert your date values to Date objects first:

function highestReview() {
        var maxNumb = [];
        for(var y = 0; y < data.reviews.length; y++){
          maxNumb.push(new Date(data.reviews[y].date));
        }
       var latestDate = new Date(Math.max.apply(null, maxNumb));
        console.log(latestDate);

      }
      highestReview();

Hope it helps

Ricardo Pontual
  • 3,749
  • 3
  • 28
  • 43