Objetos e Arrays
Aula 3 de 8
Objetos
Objetos armazenam coleções de pares chave-valor.
Literais e Propriedades
const usuario = {
nome: 'Maria',
idade: 28,
email: '[email protected]',
endereco: {
cidade: 'São Paulo',
uf: 'SP'
},
// Método
saudacao() {
return `Olá, sou ${this.nome}`;
}
};
// Acesso
console.log(usuario.nome); // 'Maria'
console.log(usuario['email']); // '[email protected]'
console.log(usuario.endereco.cidade); // 'São Paulo'
// Dinâmico
const chave = 'idade';
console.log(usuario[chave]); // 28
Métodos Estáticos
const produto = {
id: 1,
nome: 'Notebook',
preco: 3500,
tags: ['eletrônico', 'computador']
};
// Object.keys, values, entries
console.log(Object.keys(produto)); // ['id', 'nome', 'preco', 'tags']
console.log(Object.values(produto)); // [1, 'Notebook', 3500, [...]
console.log(Object.entries(produto)); // [[id,1], [nome,'Notebook'], ...]
// Iterar com entries
for (const [chave, valor] of Object.entries(produto)) {
console.log(`${chave}: ${valor}`);
}
Destructuring e Spread
// Destructuring
const { nome, idade, endereco: { cidade } } = usuario;
console.log(nome); // 'Maria'
console.log(cidade); // 'São Paulo'
// Renomear
const { nome: nomeUsuario } = usuario;
// Spread
const copia = { ...usuario };
const comNovoCampo = { ...usuario, ativo: true };
const merged = { ...usuario, ...produto };
// Rest em objetos
const { nome: nome2, ...resto } = usuario;
console.log(resto); // { idade: 28, email: ..., endereco: ... }
this
const pessoa = {
nome: 'Carlos',
falar() {
console.log(`Oi, ${this.nome}`);
},
falarAtrasado() {
// Arrow function mantém o this do objeto
setTimeout(() => {
console.log(`Oi atrasado, ${this.nome}`);
}, 1000);
}
};
pessoa.falar(); // 'Oi, Carlos'
pessoa.falarAtrasado(); // 'Oi atrasado, Carlos' (após 1s)
Arrays
Métodos Essenciais
const numeros = [1, 2, 3, 4, 5];
const frutas = ['maçã', 'banana'];
// push/pop (adicionar/remover no final)
frutas.push('laranja'); // ['maçã', 'banana', 'laranja']
frutas.pop(); // ['maçã', 'banana']
// map - transformar cada elemento
const dobrados = numeros.map(n => n * 2);
// [2, 4, 6, 8, 10]
// filter - selecionar elementos
const pares = numeros.filter(n => n % 2 === 0);
// [2, 4]
// reduce - reduzir a um valor
const soma = numeros.reduce((acc, n) => acc + n, 0);
// 15
// find - primeiro elemento que satisfaz
const primeiroPar = numeros.find(n => n % 2 === 0);
// 2
// some/every - teste lógico
const temMaiorQue3 = numeros.some(n => n > 3); // true
const todosPositivos = numeros.every(n => n > 0); // true
// sort - ordenação (cuidado!)
const misturado = [3, 10, 1, 21];
misturado.sort((a, b) => a - b); // [1, 3, 10, 21]
// flat - achatar arrays aninhados
const aninhado = [1, [2, 3], [4, [5, 6]]];
console.log(aninhado.flat(2)); // [1, 2, 3, 4, 5, 6]
// Spread em arrays
const combinado = [...numeros, ...frutas];
const clone = [...numeros];
const [primeiro, segundo, ...rest] = numeros;
Exemplo Prático
const usuarios = [
{ nome: 'Ana', idade: 25, ativo: true },
{ nome: 'João', idade: 17, ativo: false },
{ nome: 'Maria', idade: 32, ativo: true },
];
// Usuários ativos com idade >= 18
const ativosAdultos = usuarios
.filter(u => u.ativo && u.idade >= 18)
.map(u => ({
nomeCompleto: u.nome.toUpperCase(),
maioridade: true
}));
// Agrupar por status
const agrupado = usuarios.reduce((acc, u) => {
const chave = u.ativo ? 'ativos' : 'inativos';
acc[chave] = acc[chave] || [];
acc[chave].push(u.nome);
return acc;
}, {});
// { ativos: ['Ana', 'Maria'], inativos: ['João'] }
Lab: Processador de Pedidos
Crie funções que processam um array de pedidos: calcular total, filtrar por status, agrupar por cliente.
node processar-pedidos.js
const pedidos = [
{ id: 1, cliente: 'Ana', valor: 150, status: 'entregue' },
{ id: 2, cliente: 'João', valor: 80, status: 'pendente' },
{ id: 3, cliente: 'Ana', valor: 200, status: 'entregue' },
];
const totalEntregue = pedidos
.filter(p => p.status === 'entregue')
.reduce((acc, p) => acc + p.valor, 0);
console.log(`Total entregue: R$ ${totalEntregue}`);
Objetos para dados estruturados, arrays para listas. Map, filter e reduce substituem loops tradicionais com código mais expressivo.