Pessoal, estou usando o reduce para agrupar e somar alguns dados.
Array usado:
let resultMap = [
{
VISCODOPERREC: '0323 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 15,
DTMSEQDIA: '20150207',
VISQTDTOTBPAGE: 7,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
},
{
VISCODOPERREC: '0341 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 6,
DTMSEQDIA: '20150207',
VISQTDTOTBPAGE: 6,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
},
{
VISCODOPERREC: '0341 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 10,
DTMSEQDIA: '20150207',
VISQTDTOTBPAGE: 7,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
},
{
VISCODOPERREC: '0341 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 18,
DTMSEQDIA: '20150207',
VISQTDTOTBPAGE: 1,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
},
{
VISCODOPERREC: '0341 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 28,
DTMSEQDIA: '20150207',
VISQTDTOTBPAGE: 2,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
},
{
VISCODOPERREC: '0341 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 30,
DTMSEQDIA: '20150208',
VISQTDTOTBPAGE: 6,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
},
{
VISCODOPERREC: '0341 ',
VISCODOPERBDO: '0321 ',
VISJANELA: '18 ',
VISSEQCN: 59,
DTMSEQDIA: '20150207',
VISQTDTOTBPAGE: 1,
VISQTDBPFALHAAGE: 0,
YEARMONTH: '02/2015'
}
]
A parit desse array, estou agrupando o dados pelo atributos “DTMSEQDIA”, usando o seguinte função:
let dayGroup = resultMap.reduce((acumulador, valor) => {
let groupingExp;
if (filters.typeOffender == 'reg') {
groupingExp = (obj) => obj.DTMSEQDIA + ':' + obj.VISCODOPERREC + ':' + obj.VISCODOPERBDO + ':' + obj.VISSEQCN;
} else {
groupingExp = (obj) => obj.DTMSEQDIA + ':' + obj.VISCODOPERREC + ':' + obj.VISCODOPERBDO + ':' + obj.VISJANELA
}
let indice = acumulador.map(groupingExp).indexOf(groupingExp(valor));
if (indice == -1) {
acumulador.push(valor);
} else {
acumulador[indice].VISQTDTOTBPAGE += valor.VISQTDTOTBPAGE;
}
return acumulador
}, [])
Após fazer o agrupamento por datas estou tentando usar granulariade, para dividir as datas por: mês -> quinzena -> dia.
Estou usando a função a seguir para isso:
let monthMapping = dayGroup.reduce((mappedValues, item) => {
let year = item.DTMSEQDIA.substr(0, 4);
let month = item.DTMSEQDIA.substr(4, 2);
let fortnight = Number(item.DTMSEQDIA.substr(6, 2)) <= 15 ? 1 : 2;
if (mappedValues[item.YEARMONTH]) {
mappedValues[item.YEARMONTH] = {
...mappedValues[item.YEARMONTH],
VISQTDTOTBPAGE: mappedValues[item.YEARMONTH].VISQTDTOTBPAGE + item.VISQTDTOTBPAGE,
};
mappedValues[item.YEARMONTH].rows[fortnight - 1].VISQTDTOTBPAGE += item.VISQTDTOTBPAGE;
} else {
mappedValues[item.YEARMONTH] = {
YEARMONTH: `${year} - Mês ${month}`,
VISQTDTOTBPAGE: item.VISQTDTOTBPAGE,
rows: [
{
YEARMONTH: `${year} - Mês ${month} - Quinzena 1`,
VISQTDTOTBPAGE: fortnight == 1 ? item.VISQTDTOTBPAGE : 0,
fortnight: 1,
},
{
YEARMONTH: `${year} - Mês ${month} - Quinzena 2`,
VISQTDTOTBPAGE: fortnight == 2 ? item.VISQTDTOTBPAGE : 0,
fortnight: 2
},
]
};
}
return mappedValues;
}, {});
Porém só estou conseguindo agrupar os dados por datas, e preciso de mais dois atributos do meu array de retorno para fazer o agrupamento. Que seriam, “VISCODOPERBDO”, “VISCODOPERREC”.
Resultado utilizando as funções acima:
{
"02/2015":{
"YEARMONTH":"2015 - Mês 02",
"VISQTDTOTBPAGE":30,
"rows":[
{
"YEARMONTH":"2015 - Mês 02 - Quinzena 1",
"VISQTDTOTBPAGE":30,
"fortnight":1
},
{
"YEARMONTH":"2015 - Mês 02 - Quinzena 2",
"VISQTDTOTBPAGE":0,
"fortnight":2
}
]
}
}
Preciso acrescentar mais atributos do array no meu group.
Obrigado