Reputation: 53
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
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
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