Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

103
Vistas
Reduzca la matriz de matrices, concatene los datos por fechas con los datos de la semana y sume los valores

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; }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Juan Pablo Isaza Denunciar

0


Ejecutar el código

 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...

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda