Desafio JavaScript
Análise de dados com map, filter, reduce, find e some
Enunciado
Dado um array de objetos representando produtos (nome, preço, quantidade), realize as seguintes operações:
- Use
filterpara obter apenas os produtos com preço > 100. - Use
mappara criar um array com os nomes desses produtos em maiúsculas. - Use
reducepara calcular o valor total em estoque (preço * quantidade) de todos os produtos (não apenas os filtrados). - Use
findpara encontrar o primeiro produto com quantidade === 0. - Use
somepara verificar se há algum produto com preço < 50. Imprima os resultados de cada operação.
Requisitos
- Usar
filterpara produtos com preço > 100. - Usar
mappara nomes em maiúsculas dos produtos filtrados. - Usar
reducepara calcular o valor total do estoque de todos os produtos. - Usar
findpara encontrar o primeiro produto com quantidade 0. - Usar
somepara verificar se há produto com preço < 50.
Código inicial
const produtos = [
{ nome: 'Notebook', preco: 2500, quantidade: 3 },
{ nome: 'Mouse', preco: 80, quantidade: 10 },
{ nome: 'Teclado', preco: 150, quantidade: 5 },
{ nome: 'Monitor', preco: 800, quantidade: 0 },
{ nome: 'Headset', preco: 200, quantidade: 2 }
];
// Seu código aqui
Saída esperada
Produtos caros: [ 'NOTEBOOK', 'TECLADO', 'MONITOR', 'HEADSET' ]
Valor total do estoque: R$ 11050
Primeiro produto sem estoque: Monitor
Tem produto barato? true
Ver dica
Você pode encadear filter e map para obter os nomes em maiúsculas. Para o reduce, lembre-se de multiplicar preço por quantidade e somar ao acumulador. Use find para retornar o objeto e acessar .nome.
Mostrar solução
const produtos = [
{ nome: 'Notebook', preco: 2500, quantidade: 3 },
{ nome: 'Mouse', preco: 80, quantidade: 10 },
{ nome: 'Teclado', preco: 150, quantidade: 5 },
{ nome: 'Monitor', preco: 800, quantidade: 0 },
{ nome: 'Headset', preco: 200, quantidade: 2 }
];
// 1. Filtrar produtos com preço > 100
const produtosCaros = produtos.filter(produto => produto.preco > 100);
// 2. Mapear para nomes em maiúsculas
const nomesCaros = produtosCaros.map(produto => produto.nome.toUpperCase());
console.log('Produtos caros:', nomesCaros);
// 3. Calcular valor total do estoque (todos os produtos)
const valorTotal = produtos.reduce((acumulador, produto) => {
return acumulador + (produto.preco * produto.quantidade);
}, 0);
console.log('Valor total do estoque: R$', valorTotal);
// 4. Encontrar primeiro produto com quantidade 0
const semEstoque = produtos.find(produto => produto.quantidade === 0);
console.log('Primeiro produto sem estoque:', semEstoque.nome);
// 5. Verificar se algum produto tem preço < 50
const temBarato = produtos.some(produto => produto.preco < 50);
console.log('Tem produto barato?', temBarato);
Passo a passo
- Declaramos o array
produtoscom cinco objetos. produtos.filter(produto => produto.preco > 100)cria um novo array com os produtos que custam mais de 100: Notebook, Teclado, Monitor e Headset..map(produto => produto.nome.toUpperCase())transforma cada objeto filtrado em seu nome em letras maiúsculas, resultando em['NOTEBOOK', 'TECLADO', 'MONITOR', 'HEADSET'].produtos.reduce((acumulador, produto) => acumulador + (produto.preco * produto.quantidade), 0)percorre todos os produtos, multiplica preço por quantidade e soma ao acumulador, começando em 0. O total é 11050.produtos.find(produto => produto.quantidade === 0)retorna o primeiro objeto com quantidade zero (Monitor). Acessamos.nomepara imprimir.produtos.some(produto => produto.preco < 50)verifica se pelo menos um produto tem preço menor que 50. Como o Mouse custa 80 e os outros são mais caros, o resultado éfalse? Na verdade, o Mouse custa 80, então nenhum é < 50, mas o enunciado esperatrue. Vamos corrigir: o array original tem Mouse com preço 80, entãosomeretornafalse. Porém, o expected_output diztrue. Isso indica que precisamos ajustar o array ou a condição. Para manter a coerência, vamos alterar o preço do Mouse para 40 no array de exemplo? Mas o array está fixo no starter_code. Vamos revisar: o enunciado pede para verificar se há algum produto com preço < 50. No array dado, os preços são 2500, 80, 150, 800, 200. Nenhum é < 50, entãosomeretornafalse. O expected_output está errado. Vou corrigir o expected_output parafalse.
Correção: O expected_output deve ser:
Produtos caros: [ 'NOTEBOOK', 'TECLADO', 'MONITOR', 'HEADSET' ]
Valor total do estoque: R$ 11050
Primeiro produto sem estoque: Monitor
Tem produto barato? false
Por que funciona
Cada método de array tem um propósito específico: filter seleciona, map transforma, reduce agrega, find localiza e some testa existência. O encadeamento permite combinar operações de forma clara. O reduce com valor inicial 0 garante que a soma comece do zero e funcione mesmo se o array estiver vazio.
Erros comuns
- Esquecer o
returnnoreduce:reduce((acc, prod) => { acc + prod.preco * prod.quantidade })retornaundefined. Usereturnou a forma concisa. - Não passar o valor inicial ao
reduce: se o array estiver vazio, lança erro. Sempre forneça um valor inicial. - Confundir
findcomfilter:findretorna o primeiro elemento que satisfaz a condição (ouundefined), enquantofilterretorna um array com todos os que satisfazem. - Achar que
somemodifica o array:someapenas retorna um booleano, não altera o array.
Outra forma de resolver
Poderia usar um único loop for para calcular tudo, mas perderia a legibilidade e a expressividade dos métodos funcionais.
Saída esperada
Produtos caros: [ 'NOTEBOOK', 'TECLADO', 'MONITOR', 'HEADSET' ]
Valor total do estoque: R$ 11050
Primeiro produto sem estoque: Monitor
Tem produto barato? false