Raphael Melo De Lima
Raphael Melo De Lima

Reputation: 215

Filter Map and Reduce

I have the following line of code:

          $scope.listDeColaboradoresObject.forEach(item => {
            item.listNmAssunto = $scope.relatorioTotalMensagensRespondidasColab
              .filter(x => x.nmUsuario == item.nmUsuario)
              .map(x => x.nmAssunto);
            item.listNmAssunto = $scope.removeDuplicates(item.listNmAssunto);

            item.listDtResposta = $scope.relatorioTotalMensagensRespondidasColab
              .filter(x => x.nmUsuario == item.nmUsuario)
              .map(x => x.dtResposta);

          });

that runs through this array:

0: {deTipoAtendimento: "012", nmAssunto: "Cartão extraviado", nmUsuario: "15", dtResposta: "2018", total: 1}
1: {deTipoAtendimento: "012", nmAssunto: "Assunto Novo 012", nmUsuario: "Admin", dtResposta: "2018", total: 2}
2: {deTipoAtendimento: "012", nmAssunto: "Assunto Novo 012", nmUsuario: "Administrador", dtResposta: "2018", total: 1}
3: {deTipoAtendimento: "012", nmAssunto: "Assunto Novo 012", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 3}
4: {deTipoAtendimento: "012", nmAssunto: "Assunto Teste GREAt", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 2}
5: {deTipoAtendimento: "012", nmAssunto: "Thais 23042018", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 2}
6: {deTipoAtendimento: "012", nmAssunto: "teste Alterado2", nmUsuario: "Administrador IMB", dtResposta: "2018", total: 1}

and that returns me the following array:

0: {nmUsuario: "15", listNmAssunto: Array(1), listDtResposta: Array(1), $$hashKey: "object:2975"}
1: {nmUsuario: "Admin", listNmAssunto: Array(1), listDtResposta: Array(1), $$hashKey: "object:2976"}
2: {nmUsuario: "Administrador", listNmAssunto: Array(1), listDtResposta: Array(1), $$hashKey: "object:2977"}
3: {nmUsuario: "Administrador IMB", listNmAssunto: Array(4), listDtResposta: Array(4), $$hashKey: "object:2978"}

My question is how do I at the time of the map insert both the nmSubject and the dtResponse within the same array

Upvotes: 0

Views: 115

Answers (3)

Matt Way
Matt Way

Reputation: 33179

As per your results comment, it looks like you want to group your list by nmUsuario, but create a single array of objects that hold the relevant nmAssunto and dtResposta. You can achieve this with reduce(). Basically, you create an object with an empty array for each nmAssunto, and push a new object into the correct array each iteration. Then use Object.values() to convert to the final output array.

const data = [
  {deTipoAtendimento:"012",nmAssunto:"Cartão extraviado",nmUsuario:"15",dtResposta:"2018",total:1},
  {deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Admin",dtResposta:"2018",total:2},
  {deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador",dtResposta:"2018",total:1},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador IMB",dtResposta:"2018",total:3},
  {deTipoAtendimento:"012",nmAssunto:"Assunto Teste GREAt",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},
  {deTipoAtendimento:"012",nmAssunto:"Thais 23042018",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},
  {deTipoAtendimento:"012",nmAssunto:"teste Alterado2",nmUsuario:"Administrador IMB",dtResposta:"2018",total:1}
]

const groups = data.reduce((r, { nmUsuario, nmAssunto, dtResposta }) => {
  r[nmUsuario] = r[nmUsuario] || {
    nmUsuario,
    listAssunto: []
  }
  r[nmUsuario].listAssunto.push({
    a: nmAssunto,
    b: dtResposta
  })
  return r
}, {})
 
console.log(Object.values(groups))

Upvotes: 1

Nikolaus
Nikolaus

Reputation: 1869

Why you don’t map into one object? Like this:

          $scope.listDeColaboradoresObject.forEach(item => {
        item.listAssunto = $scope.relatorioTotalMensagensRespondidasColab
          .filter(x => x.nmUsuario == item.nmUsuario)
          .map(x => {a:x.nmAssunto,b: x.dtResposta});
        item.listNmAssunto = $scope.removeDuplicates(item.listAssunto);

      });

Upvotes: 1

adiga
adiga

Reputation: 35253

The code you've will just update the existing array. I'm not sure how it creates the output you've posted. But, looking at your output, I'm assuming you want to group based on the nmUsuario and create an array of objects with 2 array properties. You can do the following using reduce, destructiring and Object.values

const input = [{deTipoAtendimento:"012",nmAssunto:"Cartão extraviado",nmUsuario:"15",dtResposta:"2018",total:1},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Admin",dtResposta:"2018",total:2},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador",dtResposta:"2018",total:1},{deTipoAtendimento:"012",nmAssunto:"Assunto Novo 012",nmUsuario:"Administrador IMB",dtResposta:"2018",total:3},{deTipoAtendimento:"012",nmAssunto:"Assunto Teste GREAt",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},{deTipoAtendimento:"012",nmAssunto:"Thais 23042018",nmUsuario:"Administrador IMB",dtResposta:"2018",total:2},{deTipoAtendimento:"012",nmAssunto:"teste Alterado2",nmUsuario:"Administrador IMB",dtResposta:"2018",total:1}]

const merged = input.reduce((r,{ nmUsuario, nmAssunto, dtResposta }) => {
  r[nmUsuario] = r[nmUsuario] || {nmUsuario, listNmAssunto: [], listDtResposta:[]};
  r[nmUsuario].listNmAssunto.push(nmAssunto);
  r[nmUsuario].listDtResposta.push(dtResposta);
  return r;
},{})

const output = Object.values(merged);
console.log(output)

Upvotes: 1

Related Questions