Johan
Johan

Reputation: 53

Grouping dates within a timespan

I'm trying to group dates within the same timespan of an hour. However, some dates seems to be excluded. What did I miss? Expected result is [[date1, date2], [date3], [date4]]

function groupDates(dates) {
  var result = [];
  var intervalStart = dates[0];
  var grp = []
  dates.forEach((d,i) => {
    var diff = d.getTime() - intervalStart.getTime()
    if(diff/1000/60 <= 60) {
      grp.push(d)
    } else { 
      intervalStart = date;
      grp = [d]
      result.push(grp)
    }
  })
  return result
}

console.log(groupDates([new Date('2017-01-01 17:24'), 
    new Date('2017-01-01 17:25'), 
    new Date('2017-01-01 18:26'), 
    new Date('2017-01-01 19:27')]))

https://jsfiddle.net/ps7m03gv/

Upvotes: 0

Views: 35

Answers (2)

gurvinder372
gurvinder372

Reputation: 68363

Looks like you want to do hours level grouping, try

var output = Object.values(inputArr.reduce( function(a,b){
  var date = new Date(b);
  date.setHours( date.getHours(), 0, 0, 0 ); //remove minutes, seconds, ms
  var time = date.getTime(); //get millisecond time value as key
  a[ date.getTime() ]  = a[ date.getTime() ] || []; 
  a[ date.getTime() ].push( b ); //push the value into array
  return a;
}, {}));

var inputArr = [new Date('2017-01-01 17:24'), 
    new Date('2017-01-01 17:25'), 
    new Date('2017-01-01 18:26'), 
    new Date('2017-01-01 19:27')];

var output = Object.values(inputArr.reduce( function(a,b){
  var date = new Date(b);
  date.setHours( date.getHours(), 0, 0, 0 );
  var time = date.getTime()
  a[ date.getTime() ]  = a[ date.getTime() ] || [];
  a[ date.getTime() ].push( b );
  return a;
}, {}));

console.log( output );

Upvotes: 1

AuxTaco
AuxTaco

Reputation: 5171

The problem is in your else block. You detect that the current group should end, but you discard it before pushing it onto the result array.

Move the result.push(grp) line to the top of the else block, and add an additional result.push(grp) after the loop to handle the last group.

function groupDates(dates) {
  var result = [];
  var intervalStart = dates[0];
  var grp = [];
  dates.forEach((d,i) => {
    var diff = d.getTime() - intervalStart.getTime();
    if(diff/1000/60 <= 60) {
      grp.push(d);
    } else {
      result.push(grp);
      intervalStart = d;
      grp = [d];
    }
  })
  result.push(grp);
  return result;
}

console.log(groupDates([new Date('2017-01-01 17:24'), 
    new Date('2017-01-01 17:25'), 
    new Date('2017-01-01 18:26'), 
    new Date('2017-01-01 19:27')]));

Upvotes: 2

Related Questions