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

158
Vistas
¿Cómo resumo un valor de una matriz según la fecha y la identificación?

tengo la siguiente instancia de matriz

 this.array=[{id:"121",score:"5",createdOn:"2022-05-17T19:52:23.6846702+00:00"} {id:"121",score:"8",createdOn:"2022-05-19T13:00:00.6846702+00:00"} {id:"122",score:"7",createdOn:"2022-04-11T08:00:00.6846702+00:00"} {id:"121",score:"1",createdOn:"2022-03-12T12:00:00.6846702+00:00"} ]

¿Cómo obtengo algunos valores con una identificación y un mes coincidentes? por ejemplo, mi salida debería ser

 newArray=[{id:"121",score:13,month:"May"} {id:"122",score:7,month:"April"} {id:"121",score:1,month:"March"} ]

intenté algo como esto

 this.array.forEach(item => { var obj = {} if (obj.hasOwnProperty(item.id)) { obj["id"] = obj[item.id] + parseFloat(item.score); } else { obj["id"] = parseFloat(item.score); } this.newArray.push(obj); });

Pero no funcionó y no sé cómo verificar el mes.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede usar un 'agrupar por' bastante estándar usando una clave compuesta de id_month .

El ejemplo usa reduce() para iterar la matriz, toLocaleDateString() para recuperar el nombre del mes de la cadena de fecha ISO y un literal de plantilla para crear la clave compuesta.

La score debe convertirse en un número antes de sumar para evitar una concatenación accidental , aquí usando el operador unario más (+) .

Finalmente, tomamos solo los valores de Object.values del objeto agrupado como resultado.

 const array = [{ id: "121", score: "5", createdOn: "2022-05-17T19:52:23.6846702+00:00" }, { id: "121", score: "8", createdOn: "2022-05-19T13:00:00.6846702+00:00" }, { id: "122", score: "7", createdOn: "2022-04-11T08:00:00.6846702+00:00" }, { id: "121", score: "1", createdOn: "2022-03-12T12:00:00.6846702+00:00" },]; const result = Object.values( array.reduce((a, { id, createdOn, score, ...rest }) => { const month = new Date(createdOn).toLocaleDateString('en', { month: 'long' }); a[`${id}_${month}`] ??= { id, month, score: 0, ...rest }; a[`${id}_${month}`].score += +score; return a; }, {}) ) console.log(result)

Se puede usar exactamente la misma lógica en un bucle for...of estándar en lugar de dentro de una llamada reduce() si lo prefiere.

 const array = [{ id: "121", score: "5", createdOn: "2022-05-17T19:52:23.6846702+00:00" }, { id: "121", score: "8", createdOn: "2022-05-19T13:00:00.6846702+00:00" }, { id: "122", score: "7", createdOn: "2022-04-11T08:00:00.6846702+00:00" }, { id: "121", score: "1", createdOn: "2022-03-12T12:00:00.6846702+00:00" },]; const grouped = {} for (const { id, createdOn, score, ...rest } of array) { const month = new Date(createdOn).toLocaleDateString('en', { month: 'long' }); grouped[`${id}_${month}`] ??= { id, month, score: 0, ...rest } grouped[`${id}_${month}`].score += +score; } const result = Object.values(grouped); console.log(result)

about 4 years ago · Juan Pablo Isaza Denunciar

0

  1. Utilice un objeto temporal para contener la información actualizada.

  2. Debido a que necesita separar los objetos que tienen las mismas identificaciones pero que se crearon en diferentes meses, puede usar una clave id-month en el objeto temporal para identificarlos.

  3. Recorra la matriz de objetos que obtienen el nombre del mes y cree la clave. (He usado Intl.DateTimeFormat aquí porque puede pasar una cadena de idioma para obtener un resultado diferente de la función; intente 'es-ES' por ejemplo).

  4. Si la propiedad con esa clave no existe en el objeto temporal, agregue un objeto predeterminado al objeto temporal con un valor de objeto predeterminado y luego aumente su score (asegúrese de forzarlo a un número primero).

  5. Finalmente obtenga Object.values que devolverá una matriz de todos esos valores en el objeto temporal.

 const arr=[{id:"121",score:"5",createdOn:"2022-05-17T19:52:23.6846702+00:00"},{id:"121",score:"8",createdOn:"2022-05-19T13:00:00.6846702+00:00"},{id:"122",score:"7",createdOn:"2022-04-11T08:00:00.6846702+00:00"},{id:"121",score:"1",createdOn:"2022-03-12T12:00:00.6846702+00:00"}]; const temp = {}; const language = 'en-GB'; function getMonth(createdOn, language) { const date = new Date(createdOn); return new Intl.DateTimeFormat(language, { month: 'long' }).format(date); } for (const obj of arr) { const { id, score, createdOn } = obj; const month = getMonth(createdOn, language); const key = `${id}-${month}`; temp[key] ??= { id, score: 0, month }; temp[key].score += Number(score); } console.log(Object.values(temp));

Documentación adicional

  • Asignación de desestructuración

  • para/de

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