Tengo una matriz como esta (recuento y fecha)
day = [ { count: 1, date: '2022-07-07' }, { count: 1, date: '2022-08-14' }, { count: 2, date: '2022-07-19' }, { count: 4, date: '2022-07-19' }, { count: 2, date: '2021-01-19' }, { count: 2, date: '2021-03-02' } ]ahora estoy buscando una nueva matriz, debe ser una base de recuento total semana/mes/año
Estoy esperando como esto a continuación
month = [ { count: 7, date: '2022-07-01' }, { count: 1, date: '2022-08-01' }, { count: 2, date: '2021-01-01' }, { count: 2, date: '2021-03-01' } ] year = [ { count: 9, date: '2022-01-01' }, { count: 4, date: '2021-01-01' }, ]Igual que las bases semanales también
Estoy tratando de lograr algo como esto
let month; for( d of day ) { if(condition) { // calculation for count adding month.push(d) } }Se actualizó la respuesta según las sugerencias de RobG .
No implementé la parte groupByWeek(), pero la implementación de esta parte debería ser similar a la función groupByMonth() y groupByYear() en el código siguiente.
Para la parte groupByWeek, la parte complicada es cómo obtener el número de semana de la fecha, creo que la función getWeek() de los códigos compartidos de cmgchess en la sección de comentarios anterior sería útil, o puede usar una biblioteca de fechas para obtener la semana número.
let day = [ { count: 1, date: "2022-07-07" }, { count: 1, date: "2022-08-14" }, { count: 2, date: "2022-07-19" }, { count: 4, date: "2022-07-19" }, { count: 2, date: "2021-01-19" }, { count: 2, date: "2021-03-02" }, { count: 5, date: "2021-07-19" }, ]; // create a map of {$year-$month-01: $count} based on the data in day array let groupByMonth = day.reduce((partialCount, item) => { let dateSplit = item.date.split("-"); let y = dateSplit[0]; let m = dateSplit[1]; if (Object.prototype.hasOwnProperty.call(partialCount, `${y}-${m}-01`)) { partialCount[`${y}-${m}-01`] += item.count; } else { partialCount[`${y}-${m}-01`] = item.count; } return partialCount; }, {}); // convert the groupByMonth map into an array of object(your expected format) let monthList = Object.keys(groupByMonth).map(key => { return { count: groupByMonth[key], date: key }; }); // create a map of {$year-01-01: $count} based on the data in day array let groupByYear = day.reduce((partialCount, item) => { let dateSplit = item.date.split("-"); let y = dateSplit[0]; if (Object.prototype.hasOwnProperty.call(partialCount, `${y}-01-01`)) { partialCount[`${y}-01-01`] += item.count; } else { partialCount[`${y}-01-01`] = item.count; } return partialCount; }, {}); // convert the groupByMonth map into an array of object(your expected format) let yearList = Object.keys(groupByYear).map(key => { return { count: groupByYear[key], date: key }; }); console.log("month:", monthList); console.log("year:", yearList);Implementé una solución que devuelve un object con:
key => value = month / year => totalCount Espero que la salida esté bien para ti, me parece más lógico que usar solo una date del month / year para nombrarlo. Por cierto, puedo cambiar el formato de salida si es un problema para ti;)
Aquí está el código:
const toArray = obj => Object.keys(obj).map(k => [k, obj[k]]); // transform an object to array of array [[key], [value]]; const sum = arr => arr.reduce((ps, a) => ps + a, 0); // sum an array let day = [ { count: 1, date: '2022-07-07' }, { count: 1, date: '2022-08-14' }, { count: 2, date: '2022-07-19' }, { count: 4, date: '2022-07-19' }, { count: 2, date: '2021-01-19' }, { count: 2, date: '2021-03-02' } ]; let years = Object.fromEntries( // transform the result to an object toArray( // transform the object to array day.reduce((acc, x) => { // sort the day by month / year // key (month or year) doesn't exist => create the key => append the element (acc[x.date.split('-').at(0)] = acc[x.date.split('-').at(0)] || []).push(x.count); return acc; }, {}) ).map(arr => [arr.at(0), sum(arr.at(1))]) // sum the counts ); let months = Object.fromEntries(toArray(day.reduce((acc, x) => { (acc[x.date.split('-').at(1)] = acc[x.date.split('-').at(1)] || []).push(x.count); return acc; }, {})).map(arr => [arr.at(0), sum(arr.at(1))])); console.log(months); console.log(years);