Agrupar usando reduce() Js

Utilizei o reduce para fazer o agrupamento do meu Json, porém preciso agrupar por mais de 1 parâmetro, para fazer o group corretamente.

Segue a função utilizada:

this.totalSpecific = obj.reduce(function (acumulador, valor) {
      var indice = acumulador.map((o) => o.janela).indexOf(valor.janela);
      if (indice == -1) {
        acumulador.push(valor);
      } else {
        acumulador[indice].qtd += valor.qtd;
      }
      return acumulador;
    }, []);

Usando essa função tenho o seguinte retorno:

[{"janela":"08","qtd":2342,"port":0},
 {"janela":"20","qtd":1546,"port":0}]

Exemplo de retorno que necessito:

[{"janela":"08","qtd":1142,"port":0},
 {"janela":"08","qtd":1250,"port":1}
 {"janela":"08","qtd":950,"port":2}
 {"janela":"20","qtd":1046,"port":0},
 {"janela":"20","qtd":450,"port":1},
 {"janela":"20","qtd":50,"port":2}]

Segue Json usado:

let obj =   [{
                "janela": "08        ",
                "qtd": 3,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 11,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 63,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 2,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 129,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 3,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 5,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 6,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 33,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 53,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 77,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 589,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 4,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 13,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 18,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 131,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 36,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 24,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 109,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 11,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 40,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 6,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 43,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 351,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 68,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 21,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 84,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 340,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 6,
                "port": 0
              },
              {
                "janela": "08        ",
                "qtd": 5,
                "port": 1
              },
              {
                "janela": "08        ",
                "qtd": 3,
                "port": 1
              },
              {
                "janela": "08        ",
                "qtd": 5,
                "port": 1
              },
              {
                "janela": "08        ",
                "qtd": 3,
                "port": 1
              },
              {
                "janela": "08        ",
                "qtd": 9,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 2,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 6,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 2,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 5,
                "port": 2
              },
              {
                "janela": "08        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 150,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 4,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 12,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 38,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 188,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 247,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 9,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 11,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 2,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 22,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 155,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 23,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 15,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 96,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 81,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 12,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 75,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 169,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 9,
                "port": 0
              },
              {
                "janela": "20        ",
                "qtd": 5,
                "port": 1
              },
              {
                "janela": "20        ",
                "qtd": 31,
                "port": 1
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 1
              },
              {
                "janela": "20        ",
                "qtd": 5,
                "port": 1
              },
              {
                "janela": "20        ",
                "qtd": 31,
                "port": 1
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 1
              },
              {
                "janela": "20        ",
                "qtd": 4,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 38,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 18,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 7,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 1,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 61,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 3,
                "port": 2
              },
              {
                "janela": "20        ",
                "qtd": 6,
                "port": 2
              }
            ]

Fiz uma pequena mudança na sua função redutora:

this.totalSpecific = obj.reduce(function (acumulador, valor) {
	const groupingExp = (obj) => obj.janela + ':' + obj.port;
	var indice = acumulador.map(groupingExp).indexOf(groupingExp(valor));
	
	if (indice == -1) {
		acumulador.push(valor);
	} else {
		acumulador[indice].qtd += valor.qtd;
	}
	
	return acumulador;
}, []);

Ela agora vai levar em consideração os atributos janela e port.

Cara, exatamente isso que eu precisava, funcionou perfeitamente. Obrigado!!