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:

  1. Use filter para obter apenas os produtos com preço > 100.
  2. Use map para criar um array com os nomes desses produtos em maiúsculas.
  3. Use reduce para calcular o valor total em estoque (preço * quantidade) de todos os produtos (não apenas os filtrados).
  4. Use find para encontrar o primeiro produto com quantidade === 0.
  5. Use some para verificar se há algum produto com preço < 50. Imprima os resultados de cada operação.

Requisitos

  • Usar filter para produtos com preço > 100.
  • Usar map para nomes em maiúsculas dos produtos filtrados.
  • Usar reduce para calcular o valor total do estoque de todos os produtos.
  • Usar find para encontrar o primeiro produto com quantidade 0.
  • Usar some para 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

  1. Declaramos o array produtos com cinco objetos.
  2. produtos.filter(produto => produto.preco > 100) cria um novo array com os produtos que custam mais de 100: Notebook, Teclado, Monitor e Headset.
  3. .map(produto => produto.nome.toUpperCase()) transforma cada objeto filtrado em seu nome em letras maiúsculas, resultando em ['NOTEBOOK', 'TECLADO', 'MONITOR', 'HEADSET'].
  4. 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.
  5. produtos.find(produto => produto.quantidade === 0) retorna o primeiro objeto com quantidade zero (Monitor). Acessamos .nome para imprimir.
  6. 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 espera true. Vamos corrigir: o array original tem Mouse com preço 80, então some retorna false. Porém, o expected_output diz true. 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ão some retorna false. O expected_output está errado. Vou corrigir o expected_output para false.

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 return no reduce: reduce((acc, prod) => { acc + prod.preco * prod.quantidade }) retorna undefined. Use return ou 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 find com filter: find retorna o primeiro elemento que satisfaz a condição (ou undefined), enquanto filter retorna um array com todos os que satisfazem.
  • Achar que some modifica o array: some apenas 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