Grouping JSON using javascript reduce ()

3

Is there any way to group a Json using the Reduce() method of Javascript, as the example below:

contas = [{id: 1, descricao: "AGUA", valor: 100, juros: 5},
          {id: 1, descricao: "AGUA", valor: 100, juros: 5},
          {id: 2, descricao: "LUZ", valor: 150, juros: 10},
          {id: 2, descricao: "LUZ", valor: 150, juros: 10}];

that returns as follows:

contas = [{id:1, descricao: "AGUA", valor: 200, juros: 10},
          {id:2, descricao: "LUZ", valor: 300, juros: 20}];

Any suggestions?

    
asked by anonymous 18.07.2017 / 16:02

1 answer

3

We can use reduce starting with an empty array accumulator and adding elements that have id to the accumulator. Whenever we find a id equal we add valor and juros to what it already is.

Example:

contas = [{id: 1, descricao: "AGUA", valor: 100, juros: 5},
          {id: 1, descricao: "AGUA", valor: 100, juros: 5},
          {id: 2, descricao: "LUZ", valor: 150, juros: 10},
          {id: 2, descricao: "LUZ", valor: 150, juros: 10}];
   
   
var total = contas.reduce(function (acumulador, valor){
  //achar o indice do objeto no acumulador através do id
  var indice = acumulador.map((o) => o.id).indexOf(valor.id); 
  
  if (indice == -1){ //se não existe no acumulador adiciona o objeto corrente
    acumulador.push(valor);
  }
  else { //se já existe aumenta o valor e os juros
    acumulador[indice].valor += valor.valor;
    acumulador[indice].juros += valor.juros;

  }
  
  return acumulador; 

}, []); //iniciar o acumulador com array vazio
          

console.log(total);
    
18.07.2017 / 16:54