views:

67

answers:

1

Hi all,

I have an array that has 30 date objects. The date objects are indexed in the array from the minimum date value to the maximum date value. What I would like to do is retrieve only 7 dates from the array. Out of the 7, the first one should be the minDate and the last should be the maxDate, with 5 dates in the middle. The 7 numbers should increment evenly from the minDate to the maxDate. How would I accomplish this? Hope I was clear.

Thanks, Tonih

+1  A: 

well if you were trying to evenly distribute by date then make sure all your objects are in the date class then do array[29].getTime()-array[0].getTime() /7 for your average step, then do something like array.forEach() with a comparason function to try and get the closest to each step.

--edit--

try something like:

//dateArray is array of dates

var targetTime:Number;
var filteredarray:Array = new Array();
var step = dateArray[29].getTime()-dateArray[0].getTime() /7

var smallestdist:Number;
var currentIndex:int;

filteredarray.push(dateArray[0]); //Add the first entry
targetTime = dateArray[29].getTime(); //set the lowest point
for(var i=1; i<7; i++){ //loop 6 more times
    smallestdist = Number.POSITIVE_INFINITY; //set a large smalldist
    currentIndex = 0; //Set a small index
    targetTime += step; //increment the target time
    dateArray.forEach(testDate); //loop through the array and test with testDate function
    filteredarray[i] = dateArray[currentIndex] //Add the result to the dateArray
}

function testDate(item:Date, index:int, array:Array){
    //Check the absolute value against current stored distance
    if(Math.abs(item.getTime() - targetTime) < smallestdist){ 
        //if less then set this as new target
        smallestdist = Math.abs(item.getTime() - targetTime);
        currentIndex = index;
    }
}

of course this is dealing with a preumed even spread of dates, there could be the posibility of adding the same date to several different points if all of dateArray are clumped together, could be optimised, but see what you can do with it.

i havnt tested this code, but it should work pretty out of the box. have a look at these if you have a problem:

Array::forEach()

Date::getTime()

shortstick
Thanks, shortstick. Your logic makes sense, however, I am a newbie at this. Is it possible to show what this would look like in code? Thanks
tonedigital
there is a quick overview of one solution, not possibly the best or quickest, but probably the easiest to understand. see what you think.
shortstick