I have an array with days in it. Every day is an object, for example:
{day_year: "2012", day_month: "08", day_number: "03", day_name: "mon"}
I also added a timestamp attribute for each daily object using:
function convertDays() { var max_i = days.length; for(var i = 0; i < max_i; i++) { var tar_i = days[i]; tar_i.timestamp = new Date(tar_i.day_year, tar_i.day_month, tar_i.day_number); } }
The days in the array are arbitrary, so there is no real logic for them.
Now I want to find the next two days to any date. Therefore, if an array with days contains
- August 2, 2012
- August 4, 2012
- August 23, 2012
And I'm looking for August 11, 2012, I want him to return on August 4, 2012 and August 23, 2012.
I tried using the answer from another question that looks like this:
function findClosest(a, x) { var lo, hi; for(var i = a.length; i--;) { if(a[i] <= x && (lo === undefined || lo < a[i])) lo = a[i]; if(a[i] >= x && (hi === undefined || hi > a[i])) hi = a[i]; } return [lo, hi]; }
However, this returns unidentified .
What would be the most efficient (least processor / memory) way to do this?
Edit: "However, how are these results" weird "? Could you give an example of your code and data?"
Now I use the following to create an array of dates:
var full_day_array = []; for(var i = 0; i < 10; i++) { var d = new Date(); d.setDate(d.getDate() + i); full_day_array.push({day_year: d.getFullYear().toString(), day_month: (d.getMonth() + 1).toString(), day_number: d.getDate().toString()}); }
The strange part, using the code below, works only for an array of ten dates or shorter. When I use an array of 11 or more dates, the results are unexpected.
For example: using an array of 15 dates from August 6, 2012 to August 21, 2012. If I then call findClosest(full_day_array, new Date("30/07/2012"); you expect it to return {nextIndex: 0, prevIndex: -1} . However, it returns {nextIndex: 7, prevIndex: -1} . Why?
function findClosest(objects, testDate) { var nextDateIndexesByDiff = [], prevDateIndexesByDiff = []; for(var i = 0; i < objects.length; i++) { var thisDateStr = [objects[i].day_month, objects[i].day_number, objects[i].day_year].join('/'), thisDate = new Date(thisDateStr), curDiff = testDate - thisDate; curDiff < 0 ? nextDateIndexesByDiff.push([i, curDiff]) : prevDateIndexesByDiff.push([i, curDiff]); } nextDateIndexesByDiff.sort(function(a, b) { return a[1] < b[1]; }); prevDateIndexesByDiff.sort(function(a, b) { return a[1] > b[1]; }); var nextIndex; var prevIndex; if(nextDateIndexesByDiff.length < 1) { nextIndex = -1; } else { nextIndex = nextDateIndexesByDiff[0][0]; } if(prevDateIndexesByDiff.length < 1) { prevIndex = -1; } else { prevIndex = prevDateIndexesByDiff[0][0]; } return {nextIndex: nextIndex, prevIndex: prevIndex}; }