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.
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)Utilice un objeto temporal para contener la información actualizada.
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.
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).
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).
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