Tengo una matriz con valores por fecha, pero me gustaría resumir todos los valores por hora en lugar de una fecha/hora separada. Supongo que podría iterar sobre él y eliminar aaaa-mm-dd y luego resumir en el objeto de hora duplicada, pero ¿hay una forma más inteligente?
{ "series": [ { "value": 1, "category": "2021-03-04T04:00:00.000" }, { "value": 2, "category": "2021-03-04T05:00:00.000" }, { "value": 3, "category": "2021-03-04T06:00:00.000" }, { "value": 1, "category": "2021-03-05T04:00:00.000" }, { "value": 2, "category": "2021-03-05T05:00:00.000" }, { "value": 3, "category": "2021-03-05T06:00:00.000" } ] } ]Entonces, la matriz a continuación solo debería ser:
[ { "series": [ { "value": 2, "category": "04:00:00.000" }, { "value": 4, "category": "05:00:00.000" }, { "value": 6, "category": "06:00:00.000" } ] } ]Asignar y reducir: puede dividir en la reducción, pero esto es más legible
const data = { "series": [ { "value": 1, "category": "2021-03-04T04:00:00.000" }, { "value": 2, "category": "2021-03-04T05:00:00.000" }, { "value": 3, "category": "2021-03-04T06:00:00.000" }, { "value": 1, "category": "2021-03-05T04:00:00.000" }, { "value": 2, "category": "2021-03-05T05:00:00.000" }, { "value": 3, "category": "2021-03-05T06:00:00.000" } ] } const newData = data.series .map(item => ({value:item.value, category: item.category.split("T")[1]})) // cut the date off .reduce((acc,cur) => { const item = acc.find(({category}) => category === cur.category); // find if we already have the time in the array we are creating if (item) item.value += cur.value; // if yes, add the value else acc.push(cur); // else push the current object return acc; }, []) console.log(newData)Utilice Array.reduce
Lógica
Array.reduce .category dividiendo la picadura en T . const data = { series: [ { value: 1, category: "2021-03-04T04:00:00.000" }, { value: 2, category: "2021-03-04T05:00:00.000" }, { value: 3, category: "2021-03-04T06:00:00.000" }, { value: 1, category: "2021-03-05T04:00:00.000" }, { value: 2, category: "2021-03-05T05:00:00.000" }, { value: 3, category: "2021-03-05T06:00:00.000" }, ], }; const result = data.series.reduce((acc, curr) => { const time = curr.category.split("T")[1]; const accNode = acc.find((node) => node.category === time); if (accNode) { accNode.value += curr.value; } else { acc.push({ value: curr.value, category: time }); } return acc; }, []); console.log({ series: result, });