With grouping a list in javascript and calculating the subtotals?

5

I have the following list:

nomes = [
  { nome: "flavio", valor: 10 },
  { nome: "flavio", valor: 20 },
  { nome: "fran", valor: 30 },
  { nome: "fran", valor: 40 },
  { nome: "Roberto", valor: 50},
  { nome: "Roberto", valor: 50 }
];

How do I get:

subtotais = [
  {nome:"flavio", total:30},
  {nome:"fran", total:70},
  {nome:"Roberto", total:10}]

Thanks for any help.

    
asked by anonymous 05.06.2018 / 20:53

2 answers

3

You can iterate array to get the expected result:

function somar(antigo) {

  var resultado = [];

  antigo.reduce(function(novo, item) {
    if (!novo[item.nome]) {
      novo[item.nome] = {
        valor: 0,
        nome: item.nome
      };

      resultado.push(novo[item.nome]);
    }

    novo[item.nome].valor += item.valor;

    return novo;
  }, {});
  
  return resultado;
}

console.log(somar([
  { nome: "flavio", valor: 10 },
  { nome: "flavio", valor: 20 },
  { nome: "fran", valor: 30 },
  { nome: "fran", valor: 40 },
  { nome: "Roberto", valor: 50},
  { nome: "Roberto", valor: 50 }
]));

Translated from this OS response

    
05.06.2018 / 21:01
1

Another simple solution is to use a for normal to traverse each person, and see if the person already exists in the grouped array through findIndex . If it does not exist add the new person, otherwise add the value.

Example:

pessoas = [
  { nome: "flavio", valor: 10 },
  { nome: "flavio", valor: 20 },
  { nome: "fran", valor: 30 },
  { nome: "fran", valor: 40 },
  { nome: "Roberto", valor: 50},
  { nome: "Roberto", valor: 50 }
];

let agrupados = [];
for (let pessoa of pessoas){
  let posicao = agrupados.findIndex(p => p.nome === pessoa.nome);
  if (posicao === -1){ //se não existe
    agrupados.push(pessoa); //adiciona
  }
  else { //se já existe
    agrupados[posicao].valor += pessoa.valor; //soma o valor
  }
}

console.log(agrupados);
    
05.06.2018 / 22:13