Así que tengo un conjunto peculiar de datos:
data: [ ['2022-01-17T16:29:24', 30], // these below would aggregate to 210 ['2022-01-17T17:37:24', 30], ['2022-01-17T17:41:40', 30], ['2022-01-17T17:41:48', 30], ['2022-01-21T12:50:18', 30], ['2022-01-21T12:50:18', 30], ['2022-01-21T12:50:29', 30], ['2022-01-12T12:50:18', 30], // these below would aggregate to 90 ['2022-01-12T12:50:18', 30], ['2022-01-12T12:50:29', 30] ] Tendría que reducir esto a conjuntos de datos semanales. Convertiría las fechas al comienzo de la semana para obtener el moment(day).startOf('isoWeek') y luego combinaría los datos en fechas similares y los reduciría a una sola entrada.
El resultado final se vería así:
data: [ ['2022-01-17T00:00:00', 210], ['2022-01-10T00:00:00', 90] ] Pero estoy buscando sugerencias sobre cómo usar .reduce() o cualquier otra solución más moderna para esto que sería eficaz en conjuntos grandes. En este momento he anidado bucles para esto que (aparte de verse mal) probablemente funcionen bastante mal porque itera varias veces sobre la misma matriz. Un requisito es que el moment debe usarse para la manipulación de la fecha, intente evitar los objetos de Date .
Ahora mismo tengo algo como esto:
mergeDataToWeek(data: any[]) { let reducedArrays = []; for (let arr of data) { if (moment(arr[0]).isValid() && arr[1] > 0) { arr[0] = moment(arr[0]).startOf('isoWeek').toISOString(true); if (!reducedArrays.some(reduced => reduced[0] == (arr[0]))) { reducedArrays.push(arr); } else { let target = reducedArrays.find(reduced => reduced[0] == arr[0]); target[1] += arr[1]; } } } console.log(reducedArrays); return reducedArrays; }Estoy tratando de resolverlo usando reducir, pero el resultado será un objeto. Como esto:
const moment = require("moment") var x = [ ['2022-01-17T16:29:24', 30], ['2022-01-17T17:37:24', 30], ['2022-01-17T17:41:40', 30], ['2022-01-17T17:41:48', 30], ['2022-01-21T12:50:18', 30], ['2022-01-21T12:50:18', 30], ['2022-01-21T12:50:29', 30], ['2022-01-12T12:50:18', 30], ['2022-01-12T12:50:18', 30], ['2022-01-12T12:50:29', 30] ] // solution var y = x.reduce((a,b) => { const key = moment(b[0]).startOf("isoWeek").format() a[key] = a[key]? a[key]+b[1]: b[1] return a }, {}) console.log(y)Producción:
{ "2022-01-17T00:00:00+07:00": 210, "2022-01-10T00:00:00+07:00": 90 }Pero si lo quiere como una matriz como la suya, podemos convertirlo de la siguiente manera:
var z = Object.keys(y).map(i => [i,y[i]]) // OR THIS -- Thanks to @ghybs var z = Object.entries(y) console.log(z)Producción:
[ [ '2022-01-17T00:00:00+07:00', 210 ], [ '2022-01-10T00:00:00+07:00', 90 ] ]Aunque no es la mejor solución, creo que será mucho más legible que el bucle anidado.
let x = [ ['2022-01-17T16:29:24', 30], ['2022-01-17T17:37:24', 30], ['2022-01-17T17:41:40', 30], ['2022-01-17T17:41:48', 30], ['2022-01-21T12:50:18', 30], ['2022-01-21T12:50:18', 30], ['2022-01-21T12:50:29', 30], ['2022-01-12T12:50:18', 30], ['2022-01-12T12:50:18', 30], ['2022-01-12T12:50:29', 30] ] // solution const groupedTotal = x.reduce((a, b) => { const key = moment(b[0]).startOf("isoWeek").format() a[key] = a[key] ? a[key] + b[1] : b[1] return a }, {}); const totals = Object.entries(groupedTotal); console.log("Grouped Total:", groupedTotal, "\n Totals:", totals); <script src="https://unpkg.com/moment@2.29.1/moment.js"></script>Nota : - Código de @Rizal Ardhi Rahmadani...