Tengo una variedad de objetos relacionados con eventos. Los eventos están organizados por clave/valor donde la Clave es un DateTime del comienzo del mes, y el valor es un Array u objetos que tienen un DateTime específico dentro de ese mes.
allEvents = [ { key: "Dec 2021", value: [ { id: 0, date: "Dec 06 2021" }, { id: 1, date: "Dec 01 2021" }, ], }, { key: "Nov 2021", value: [ { id: 0, date: "Nov 27 2021" }, { id: 1, date: "Nov 23 2021" }, { id: 2, date: "Nov 10 2021" }, ], }, { key: "Oct 2021", value: [ { id: 0, date: "Oct 27 2021" }, { id: 1, date: "Oct 23 2021" }, { id: 2, date: "Oct 10 2021" }, ], }, ];Necesito filtrar estos eventos por un rango de fechas determinado, por ejemplo, 15 de noviembre de 2021 - 04 de diciembre de 2021
Esto debería filtrar el objeto de octubre y también cualquier evento que se encuentre dentro del rango de fechas dado mientras se mantiene el objeto principal. Entonces el resultado sería:
filteredEvents = [ { key: "Dec 2021", value: [ { id: 1, date: "Dec 01 2021" }, ], }, { key: "Nov 2021", value: [ { id: 0, date: "Nov 27 2021" }, { id: 1, date: "Nov 23 2021" }, ], }, ];Hasta ahora, he realizado el filtrado a nivel de mes como se muestra a continuación, pero no sé cómo manejar el nivel de día.
const dateRange = ["Nov 15 2021", "Dec 04 2021"]; const min = dateRange[0].getTime(); const max = dateRange[1].getTime(); const filteredEvents = allEvents.filter( eventGroup => new Date(eventGroup.key).getTime() >= min && new Date(eventGroup.key).getTime() <= max);Idealmente, me gustaría usar ES6, pero puede usar lodash.
por una cosa,
const min = dateRange[0].getTime(); const max = dateRange[1].getTime();necesita ser:
const min = new Date(dateRange[0]).getTime(); const max = new Date(dateRange[1]).getTime(); Luego, después del ciclo inicial, haría un mapa para eliminar elementos del value . La lógica sería muy similar al filtro que ya tienes.
Esto parece un poco difícil de manejar, pero es bastante simple. Primero, map su matriz y value.date cualquier valor. fecha que no se ajuste al rango. Luego, simplemente filtre los elementos principales que tengan una matriz de valor de longitud cero.
const filteredEvents = (from, to) => allEvents .map( g => ({...g, value: g.value.filter(f => new Date(f.date).getTime() >= new Date(from).getTime() && new Date(f.date).getTime() <= new Date(to).getTime()) })) .filter(f => f.value.length>0); let allEvents = [{ key: "Dec 2021", value: [{ id: 0, date: "Dec 06 2021" }, { id: 1, date: "Dec 01 2021" }, ], }, { key: "Nov 2021", value: [{ id: 0, date: "Nov 27 2021" }, { id: 1, date: "Nov 23 2021" }, { id: 2, date: "Nov 10 2021" }, ], }, { key: "Oct 2021", value: [{ id: 0, date: "Oct 27 2021" }, { id: 1, date: "Oct 23 2021" }, { id: 2, date: "Oct 10 2021" }, ], }, ]; const filteredEvents = (from, to) => allEvents .map( g => ({...g, value: g.value.filter(f => new Date(f.date).getTime() >= new Date(from).getTime() && new Date(f.date).getTime() <= new Date(to).getTime())})).filter(f => f.value.length>0); console.log(filteredEvents("Nov 15 2021", "Dec 04 2021"));Los valores para cada evento tienen una fecha completa. Úselos para excluir fechas fuera del rango, luego excluya cualquier evento sin valores.
const allEvents = [ { key: "Dec 2021", value: [ { id: 0, date: "Dec 06 2021" }, { id: 1, date: "Dec 01 2021" }, ], }, { key: "Nov 2021", value: [ { id: 0, date: "Nov 27 2021" }, { id: 1, date: "Nov 23 2021" }, { id: 2, date: "Nov 10 2021" }, ], }, { key: "Oct 2021", value: [ { id: 0, date: "Oct 27 2021" }, { id: 1, date: "Oct 23 2021" }, { id: 2, date: "Oct 10 2021" }, ], }, ]; const dateRange = ["Nov 15 2021", "Dec 04 2021"]; const [min, max] = dateRange.map(d => new Date(d).getTime()); const filteredEvents = allEvents.map(({key,value}) => ({ key, value:value.filter(({date:d}) => new Date(d).getTime() >= min && new Date(d).getTime() <= max) })) .filter(({value:v}) => v.length); console.log( filteredEvents );