Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Duvida sobre reduce()

Olá,

Estava fazendo alguns teste com reduce() e fiquei com a seguinte duvida, poque quando estou tentando somar os valores de um array de objetos tenho que passar o valor inicial de total e quando utilizo um array "simples" não?

Pra ficar mais claro, segue os testes:

1) Array

  var total = [0, 1, 2, 3].reduce((a, b) => a + b);
  console.log(total);

 //6

2)Array de objetos

let usuarios = [

    {nome: 'User 1', email: 'user1@gmail.com', idade: 24, gasto: 50},
    {nome: 'User 2', email: 'user2@gmail.com', idade: 21, gasto: 60},
    {nome: 'User 3', email: 'user3@gmail.com', idade: 24, gasto: 70}
];

let totalGastoUsuario = usuarios.reduce((total, usuario) => total + usuario.gasto, 0.0);
console.log(totalGastoUsuario);

//180

3)Array de objetos sem o valor inicial do total

let usuarios = [

    {nome: 'User 1', email: 'user1@gmail.com', idade: 24, gasto: 50},
    {nome: 'User 2', email: 'user2@gmail.com', idade: 21, gasto: 60},
    {nome: 'User 3', email: 'user3@gmail.com', idade: 24, gasto: 70}
];

let totalGastoUsuario = usuarios.reduce((total, usuario) => total + usuario.gasto);
console.log(totalGastoUsuario);
//[object Object]6070

Aparentemente ele concatena tudo (apesar dele ignorar o primeiro valor), mas estranho que quando utilizo um array somente com números ele soma tudo corretamente, isso ocorre justamente porque estou lidando com objetos?

Agradeço atenção desde ja!

2 respostas
solução!

Oi Luiz, quando você não passa o valor inicial como argumento, ele utiliza o que estiver na primeira posição do seu array, que nesse caso é um objeto. E aí rola o problema, porque ele tenta somar o objeto com um número na primeira passagem :(.

ahh entendi, muuito obrigado Alberto!