Búsqueda de sitios web

html - Agrupar arreglo de Javascript por intervalo


Tengo un arreglo de objetos con diferentes TimeStamps, que son objetos Moment de MomentJS.

 [
  {
    "name": "A",
    "eventDateTime": "2016-12-09 07:50:17",
  },
  {
    "name": "B",
    "eventDateTime": "2016-12-09 06:50:17",
  },
  {
    "name": "C",
    "eventDateTime": "2016-12-09 07:01:17",
  }
]

Ahora lo que necesito hacer (normalmente hay más de estos objetos) es primero ordenarlos y luego agruparlos por intervalos de 15 minutos.

Así de ordenado debería conseguir

[
  {
    "name": "B",
    "eventDateTime": "2016-12-09 06:50:17",
  },
  {
    "name": "C",
    "eventDateTime": "2016-12-09 07:01:17",
  },
  {
    "name": "A",
    "eventDateTime": "2016-12-09 07:50:17",
  }]

Y luego necesito agruparlos empezando con el primer objeto con la hora 06:50:17. Así que este será mi primer grupo donde se deben agregar todos los objetos que estén entre 06:50:17 y 07:05:17. Como el arreglo está ordenado, puedo simplemente iterar hasta que un objeto sea más antiguo que 07:05:17.

En general, no es difícil de entender, sin embargo, debería ser lo más eficiente posible. Usamos Lodash.js, que tiene muchas funcionalidades. Conozco el método groupBy, sin embargo no sé cómo A) usar MomentJS y B) definir una función dentro de él, que compruebe intervals.

¿Tienen algunos consejos?

Respuesta #1

var data = [{
  "name": "A",
  "eventDateTime": "2016-12-09 07:50:17",
}, {
  "name": "B",
  "eventDateTime": "2016-12-09 06:50:17",
}, {
  "name": "C",
  "eventDateTime": "2016-12-09 07:01:17",
}];
var sortedDate = _.sortBy(data, function(o) {
  return o.eventDateTime;
});

var groupTime = null; // new Date(new Date(sortedData[0].eventDateTime).getTime() + 15 * 60000);
var groupedData = _.groupBy(sortedDate, function(d) {
  // no need to do this if eventDateTime is already a Date object
  var time = new Date(d.eventDateTime);
  // you can remove this condition and initialize groupTime with [0].eventDateTime
  if (!groupTime) groupTime = new Date(time.getTime() + 15 * 60000);
  return time - groupTime <= 900000 ? groupTime : groupTime = time;
});

// modify the groupedData keys however u want
console.log(groupedData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>