Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

120
Views
Filtre una matriz de objetos por clave y valor anidado en JavaScript

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.

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

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.

about 4 years ago · Juan Pablo Isaza Report

0

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

about 4 years ago · Juan Pablo Isaza Report

0

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

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!