在一个时间内对日期进行分组

时间:2017-12-12 12:28:12

标签: javascript

我正在尝试在一小时的相同时间内对日期进行分组。但是,有些日期似乎被排除在外。我错过了什么?预期结果为[[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/

2 个答案:

答案 0 :(得分:2)

问题出在else块中。您检测到当前组应该结束,但是在将其推送到result阵列之前将其丢弃。

result.push(grp)行移至else块的顶部,并在循环后添加额外的result.push(grp)以处理最后一个组。

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')]));

答案 1 :(得分:1)

您希望小时级别分组,请尝试

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 );