Tengo la siguiente matriz de objetos.
const monthlyList = [ { "leave_id":119, "employee_id":"25528", "from_date":"2022-03-10", "to_date":"2022-03-11", "employee_name":"Name 1" }, { "leave_id":120, "employee_id":"25529", "from_date":"2022-03-10", "to_date":"2022-03-13", "employee_name":"Name 2" }, { "leave_id":121, "employee_id":"25530", "from_date":"2022-03-15", "to_date":"2022-03-18", "employee_name":"Name 3" }, { "leave_id":123, "employee_id":"25530", "from_date":"2022-03-20", "to_date":"2022-03-20", "employee_name":"Name 3" } ]Estoy tratando de mostrar el recuento de eventos de licencia para cada día en un calendario usando FullCalendar. Para esto, estoy tratando de obtener una matriz en el siguiente formato
[ { "date":"2022-03-10", "count":2 }, { "date":"2022-03-11", "count":2 }, { "date":"2022-03-12", "count":1 } --- etc ]Es decir, si hay dos hojas en la misma fecha, el conteo debe ser 2. Además, debe calcular el conteo de todas las fechas entre from_date y to_date para que pueda mostrar el conteo en el calendario para todas las fechas que caen entre el rango.
Uso el siguiente código usando lodash para agrupar según from_date y to_date y desde allí puedo crear la matriz anterior. Pero no estoy seguro de cómo hacerlo para los días intermedios
let groupedListFrom = _.groupBy(monthlyList, "from_date"); let groupedListTo = _.groupBy(monthlyList, "to_date");Será muy útil si alguien me puede ayudar aquí. Gracias
Un posible enfoque usando reduce en lugar de Lodash.
Usé https://gist.github.com/miguelmota/7905510 como ayuda para obtener objetos de fecha entre dos fechas determinadas.
const monthlyList = [ { "leave_id":119, "employee_id":"25528", "from_date":"2022-03-10", "to_date":"2022-03-11", "employee_name":"Name 1" }, { "leave_id":120, "leave_id":"25529", "from_date":"2022-03-10", "to_date":"2022-03-13", "employee_name":"Name 2" }, { "leave_id":121, "employee_id":"25530", "from_date":"2022-03-15", "to_date":"2022-03-18", "employee_name":"Name 3" }, { "leave_id":123, "employee_id":"25530", "from_date":"2022-03-20", "to_date":"2022-03-20", "employee_name":"Name 3" } ] //a function to get Date objects between two given dates (inclusive) //https://gist.github.com/miguelmota/7905510 const getDates = (startDate, endDate) => { const dates = [] let currentDate = startDate const addDays = function (days) { const date = new Date(this.valueOf()) date.setDate(date.getDate() + days) return date } while (currentDate <= endDate) { dates.push(currentDate) currentDate = addDays.call(currentDate, 1) } return dates } let x = Object.values(monthlyList.reduce((acc,{leave_id,employee_id,from_date,to_date,employee_name})=>{ const dates = getDates(new Date(from_date), new Date(to_date)); dates.forEach((date) => { let strippedDate = date.toISOString().substring(0,10); if(!acc[strippedDate])acc[strippedDate]={date:strippedDate,count:0}; acc[strippedDate].count+=1 }) return acc; },{})) console.log(x)var DateTime = require('luxon').DateTime; let leavesArray = {}; monthlyList.forEach(x => { let a = DateTime.fromFormat(x.from_date,"yyyy-MM-dd") let b = DateTime.fromFormat(x.to_date,"yyyy-MM-dd") while (a <= b) { let date = a.toFormat("yyyy-MM-dd"); if (leavesArray[date]) { leavesArray[date]["count"]++; } else { leavesArray[date] = {} leavesArray[date]["count"] = 1; } a = a.plus({days: 1}) } })Solución de trabajo de Node Js