Desafio JavaScript

Função de estatísticas com parâmetros padrão e rest

Enunciado

Crie uma função estatisticas que recebe um número mínimo de valores (pelo menos um) e retorna um objeto com a soma, a média, o maior e o menor valor. Use parâmetros padrão para permitir que a função seja chamada sem argumentos? Não, ela exige pelo menos um número. No entanto, use parâmetros padrão para o caso de valores não numéricos? Melhor: a função deve aceitar um número variável de argumentos (rest) e retornar um objeto com as estatísticas. Se nenhum argumento for passado, retorne null. Use arrow function para a função media interna? Não é necessário. O foco é rest e parâmetros padrão? O enunciado deve ser claro: use rest para agrupar os números, e parâmetros padrão para definir um valor inicial para o acumulador? Não, parâmetros padrão não se aplicam bem aqui. Vamos reformular: crie uma função estatisticas que recebe um array de números e um objeto de opções com valores padrão. As opções podem incluir precisao (casas decimais) e incluirExtremos (booleano). Use parâmetros padrão para as opções. Retorne um objeto com soma, media, maior, menor, e se incluirExtremos for true, inclua também os extremos. Use rest? Não, o array já é passado. Mas o sub tópico rest deve ser coberto. Então, melhor: a função recebe números variáveis e um último argumento opcional de opções? Isso é confuso. Vou simplificar: a função estatisticas recebe qualquer quantidade de números e retorna um objeto com soma, média, maior e menor. Se nenhum número for passado, retorna null. Use rest para os números. Para a média, use uma função interna que aplica toFixed com precisão padrão de 2 casas. Use parâmetro padrão na função interna? Sim: const media = (soma, qtd, precisao = 2) => (soma / qtd).toFixed(precisao); Isso cobre parâmetros padrão. E a função principal usa rest. Então o enunciado: Crie uma função estatisticas que aceita qualquer quantidade de números (use rest) e retorna um objeto com soma, media, maior e menor. A média deve ser calculada com 2 casas decimais usando uma função auxiliar calcularMedia que tem parâmetro padrão para a precisão. Se nenhum número for passado, retorne null. Exiba o resultado para estatisticas(10, 5, 8, 3) e estatisticas().

Requisitos

  • A função principal deve se chamar estatisticas e usar rest para receber os números.
  • Deve retornar null se nenhum número for passado.
  • Deve retornar um objeto com as propriedades soma, media, maior, menor.
  • A média deve ser calculada por uma função auxiliar calcularMedia que usa parâmetro padrão para a precisão (2 casas decimais).
  • O resultado deve ser exibido no console para os dois casos.

Código inicial

// Crie a função calcularMedia e estatisticas aqui

Saída esperada

{ soma: 26, media: '6.50', maior: 10, menor: 3 }
null
Ver dica

Use Math.max(...numeros) e Math.min(...numeros) para maior e menor. Para a média, divida a soma pela quantidade e use toFixed com precisão padrão.

Mostrar solução
// Função auxiliar com parâmetro padrão para precisão
const calcularMedia = (soma, quantidade, precisao = 2) => {
  return (soma / quantidade).toFixed(precisao);
};

// Função principal com rest
function estatisticas(...numeros) {
  if (numeros.length === 0) {
    return null;
  }

  const soma = numeros.reduce((acc, n) => acc + n, 0);
  const media = calcularMedia(soma, numeros.length);
  const maior = Math.max(...numeros);
  const menor = Math.min(...numeros);

  return { soma, media, maior, menor };
}

console.log(estatisticas(10, 5, 8, 3));
console.log(estatisticas());

Passo a passo

  1. Definimos calcularMedia como arrow function que recebe soma, quantidade e precisao (com padrão 2). Retorna a divisão formatada com toFixed.
  2. A função estatisticas usa o parâmetro rest ...numeros para agrupar todos os argumentos em um array.
  3. Verificamos se o array está vazio; se sim, retornamos null.
  4. Calculamos a soma com reduce, começando do zero.
  5. Chamamos calcularMedia passando a soma e a quantidade de números. O terceiro argumento é omitido, então a precisão padrão 2 é usada.
  6. Calculamos o maior e o menor usando Math.max e Math.min com spread (...numeros), pois essas funções esperam argumentos separados.
  7. Retornamos um objeto com as quatro propriedades.
  8. Exibimos no console o resultado para quatro números e para nenhum número.

Por que funciona

O operador rest permite que a função aceite qualquer quantidade de argumentos, armazenando-os em um array. O parâmetro padrão na função auxiliar garante que a precisão seja 2 caso não seja especificada. O spread operator (...) é usado para passar os elementos do array como argumentos separados para Math.max e Math.min. A verificação de array vazio evita divisão por zero e retorna null conforme solicitado.

Erros comuns

  • Esquecer o spread em Math.max: Math.max(numeros) retorna NaN porque espera números soltos. Use Math.max(...numeros).
  • Não tratar array vazio: se numeros.length === 0, a média seria NaN e Math.max retornaria -Infinity. Sempre verifique.
  • Confundir toFixed com arredondamento: toFixed retorna uma string e arredonda para o número especificado de casas decimais. Se precisar de número, converta com Number() ou parseFloat.
  • Usar arguments em arrow function: arrow functions não têm arguments. Use rest.

Outra forma de resolver

Usando for...of para calcular soma, maior e menor manualmente:

function estatisticas(...numeros) {
  if (numeros.length === 0) return null;
  let soma = 0;
  let maior = -Infinity;
  let menor = Infinity;
  for (const n of numeros) {
    soma += n;
    if (n > maior) maior = n;
    if (n < menor) menor = n;
  }
  const media = (soma / numeros.length).toFixed(2);
  return { soma, media, maior, menor };
}

Essa versão evita o spread e pode ser mais eficiente para arrays muito grandes.

Saída esperada

{ soma: 26, media: '6.50', maior: 10, menor: 3 }
null