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>