How to filter json data by date range in javascript

I want to filter the json data below by start date and end date, it should return data between start date and end date, I tried to achieve using the code below, but I am doing something wrong to filter. I'm new to technologies like Javascript and jquery, it would be helpful if someone can fix me, which I am doing wrong here:

<html> <head> <title>Test</title> </head> <body> <script type="text/javascript"> var product_data = [ { "productId": "12", "productName": "ProductA", "productPrice": "1562", "ProductDateCreated": "2015-07-24T12:58:17.430Z", "TotalProduct": 294 }, { "productId": "13", "productName": "ProductB", "productPrice": "8545", "TotalProduct": 294, "ProductHits": { "2015-08-01T00:00:00Z" } }, { "productId": "14", "productName": "ProductC", "productPrice": "8654", "TotalProduct": 78, "ProductHits": { "2015-08-10T00:00:00Z" } }, { "productId": "15", "productName": "ProductD", "productPrice": "87456", "TotalProduct": 878, "ProductHits": { "2015-05-12T00:00:00Z" } } ]; var startDate = "2015-08-04"; var endDate = "2015-08-12"; var resultProductData = product_data.filter( function (a) { return (a.ProductHits) > startDate && (a.ProductHits) < endDate; }); console.log(resultProductData); </script> </body> </html> 
+5
source share
1 answer
  var startDate = new Date("2015-08-04"); var endDate = new Date("2015-08-12"); var resultProductData = product_data.filter(function (a) { var hitDates = a.ProductHits || {}; // extract all date strings hitDates = Object.keys(hitDates); // convert strings to Date objcts hitDates = hitDates.map(function(date) { return new Date(date); }); // filter this dates by startDate and endDate var hitDateMatches = hitDates.filter(function(date) { return date >= startDate && date <= endDate }); // if there is more than 0 results keep it. if 0 then filter it away return hitDateMatches.length>0; }); console.log(resultProductData); 

script: http://jsfiddle.net/4nz1ahuw/


UPDATE , as Ates Goral suggests in the comments, the solution above can be optimized using Array.protype.some:

  var startDate = new Date("2015-08-04"); var endDate = new Date("2015-08-12"); var resultProductData = product_data.filter(function (a) { var hitDates = a.ProductHits || {}; // extract all date strings hitDates = Object.keys(hitDates); // improvement: use some. this is an improment because .map() // and .filter() are walking through all elements. // .some() stops this process if one item is found that returns true in the callback function and returns true for the whole expression hitDateMatchExists = hitDates.some(function(dateStr) { var date = new Date(dateStr); return date >= startDate && date <= endDate }); return hitDateMatchExists; }); console.log(resultProductData); 

Thank you for your good advice :)

+5
source

All Articles