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
estatisticase usar rest para receber os números. - Deve retornar
nullse 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
calcularMediaque 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
- Definimos
calcularMediacomo arrow function que recebesoma,quantidadeeprecisao(com padrão2). Retorna a divisão formatada comtoFixed. - A função
estatisticasusa o parâmetro rest...numerospara agrupar todos os argumentos em um array. - Verificamos se o array está vazio; se sim, retornamos
null. - Calculamos a soma com
reduce, começando do zero. - Chamamos
calcularMediapassando a soma e a quantidade de números. O terceiro argumento é omitido, então a precisão padrão2é usada. - Calculamos o maior e o menor usando
Math.maxeMath.mincom spread (...numeros), pois essas funções esperam argumentos separados. - Retornamos um objeto com as quatro propriedades.
- 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)retornaNaNporque espera números soltos. UseMath.max(...numeros). - Não tratar array vazio: se
numeros.length === 0, a média seriaNaNeMath.maxretornaria-Infinity. Sempre verifique. - Confundir
toFixedcom arredondamento:toFixedretorna uma string e arredonda para o número especificado de casas decimais. Se precisar de número, converta comNumber()ouparseFloat. - Usar
argumentsem arrow function: arrow functions não têmarguments. 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