Semana 4 – Resolução de Problemas/Lógica aplicada e JavaScript (sintaxe básica)
- Objetos
- Arrays
- Métodos de iteração
- Extra: Introdução a Programação Orientada a Objeto com JS
- Ferramentas da semana: readline e nodemon
- Usar as reações do zoom e levantar a mão para sinalizar que gostaria de falar
- Enviar as dúvidas no chat
- Manter microfone desligado quando outras pessoas estiverem falando
- Manter câmera ligada o máximo possível
- Momento mão no código, momento de olho na tela
---
Objeto é um tipo de dado que contém uma coleção de propriedades organizadas em pares de chave (ou nome) e valor, sendo o valor qualquer tipo de dado (número, texto, função ou até mesmo outro objeto).
Para criar um novo Objeto, podemos atribuir a uma variável uma lista de elementos entre chaves, separados por vírgula e com a notação de chave : valor
. Também é possível utilizando a palavra reservada new
ou a partir de uma função.
const pessoa = {
nome: 'Ariel',
idade: 25,
profissao: 'desenvolvedora',
};
const pessoa = new Object();
pessoa.nome = 'Ariel';
pessoa.idade = 25;
pessoa.profissao = 'desenvolvedora';
Notação de ponto
const pessoa = {
nome: 'Ariel',
idade: 25,
profissao: 'desenvolvedora',
};
console.log(pessoa.nome); // Ariel
console.log(pessoa.idade); // 25
console.log(pessoa.profissao); // desenvolvedora
Notação de colchetes (ou índice)
const pessoa = {
nome: 'Ariel',
idade: 25,
profissao: 'desenvolvedora',
};
console.log(pessoa['nome']); // Ariel
console.log(pessoa['idade']); // 25
console.log(pessoa['profissao']); // desenvolvedora
Mais exemplos:
Declaração de objetos
const objeto = new Object()
objeto.nome = 'cadeira'
objeto.tipo = 'madeira'
objeto.peso = 7
const pokemon = {
nome: 'Pikachu',
tipo: 'elétrico',
altura: 40.6,
}
Acessando o valor de uma propriedade do objeto.
console.log(pokemon.nome) // Pikachu
const nome = pokemon.nome
const tipo = pokemon.tipo
const altura = pokemon.altura
console.log(nome) // Pikachu
console.log(tipo) // elétrico
console.log(altura) // 40.6
Alterando propriedades
pokemon.nome = 'Bulbasaur'
Adicionando propriedades
pokemon.peso = '6,9kg'
Deletando propriedades
delete = pokemon.peso
Atribuição via desestruturação
const { nome, tipo, altura } = pokemon
console.log(nome) // Pikachu
console.log(tipo) // elétrico
console.log(altura) // 40.6
const hoje = new Date()
console.log(hoje) // 2020-09-05T10:56:49.693Z
const dia = hoje.getDate()
const mes = hoje.getMonth()
const ano = hoje.getFullYear()
console.log(dia, mes, ano) // 5 8 2020 🤔
const dataFormatada = hoje.toLocaleDateString('pt-BR')
console.log(dataFormatada) // 05/09/2020
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }
const dataLonga = hoje.toLocaleDateString('pt-BR', options)
console.log(dataLonga) // sábado, 5 de setembro de 2020
MDN: date, toLocaleDateString
Um array (ou lista) permite armazenar um conjunto de dados e atribuí-los a uma variável, sendo esta a estrutura de dados mais simples possível.
Para criar um novo Array, podemos atribuir a uma variável uma lista de elementos entre colchetes e separados por vírgula. Também é possível utilizando a palavra reservada new
e instanciando os valores que queremos atribuir ou apenas especificando o seu tamanho.
const alunasReprograma = ['Andreia', 'Fernanda', 'Mariana', ...];
const alunasReprograma = new Array('Andreia', 'Fernanda', 'Mariana', ...);
Para acessar o valor de um Array, use a notação de colchetes e informe a posição que deseja acessar, lembrando que a contagem começa em zero.
const alunasReprograma = ['Andreia', 'Fernanda', 'Mariana', ...];
console.log(alunasReprograma[0]) // Andreia
console.log(alunasReprograma[1]) // Fernanda
console.log(alunasReprograma[2]) // Mariana
filter
retorna um novo array com os elementos filtrados.find
retorna o primeiro elemento que achar igual ao elemento passado por parâmetro.indexOf
retorna a posição do item passado por parâmetro ou -1 caso não tenha encontrado.length
retorna um número que representa o tamanho do array.map
retorna um novo array sem alterar o array original, criando uma cópia com as alterações que desejamos.pop
remove e retorn o último item do array.push
adiciona um item na última posição do array.shift
remove e retorna o primeiro item do array.slice
copia o array para outra variável.splice
remove o item da posição passada por parâmetrounshift
adiciona um item na primeira posição do array.
for (numero of numeros) {
const dobro = numero * 2
console.log(dobro)
}
// 18
// 4
// 10
MDN: for...of
O método
map()
invoca a funçãocallback
passada por argumento para cada elemento do Array e devolve um novo Array como resultado. Fonte: MDN map
function dobrar(item) {
return item * 2
}
const numerosDobrados = numeros.map(dobrar)
console.log(numerosDobrados) // [18, 4, 10]
Deixando mais conciso:
const numerosDobrados = numeros.map(function (item) {
return item * 2
})
console.log(numerosDobrados) // [18, 4, 10]
Refatorando para JS moderno:
const numerosDobrados = numeros.map(item => item * 2)
console.log(numerosDobrados) // [18, 4, 10]
Obs: o método map
não alterar o array original. Ele retorna um array novo com o resultado do map
.
O método find executa a função callback uma vez para cada elemento presente no array até que encontre um onde callback retorne o valor true. Se o elemento é encontrado, find retorna imediatamente o valor deste elemento. Caso contrário, find retorna undefined. Fonte MDN: find
function procuraCinco(item) {
return item === 5
}
const achouCinco = numeros.find(procuraCinco)
console.log(achouCinco) // 5
function impar(item) {
return item % 2 !== 0
}
const numerosImpares = numeros.filter(impar)
Deixando mais conciso:
const numerosImpares = numeros.filter(function (item) {
return item % 2 !== 0
})
Refatorando para JS moderno:
const numerosImpares = numeros.filter(item => item % 2 !== 0)
console.log(numerosImpares) // [9, 5]
Obs: o método filter
não altera o array original. Ele retorna um array novo com o resultado do filter
.
MDN: filter
O método sort
recebe uma função de callback opcional. Caso a função não seja fornecida, o array segue a ordenação dos caracteres Unicode.
Se o parâmetro funcaoDeComparacao é fornecido, o array será ordenado de acordo com o valor de retorno da funcaoDeComparacao. Considerando que a e b são dois elementos sendo comparados, então:
- Se
funcaoDeComparacao(a, b)
for menor que 0, ordenaa
para um índice anterior ab
, i.e.a
vem primeiro.- Se
funcaoDeComparacao(a, b)
retornar 0, deixaa
eb
inalterados em relação um ao outro, mas ordenado em relação a todos os outros elementos.- Se
funcaoDeComparacao(a, b)
é maior que 0, ordenab
para um índice anterior quea
.funcaoDeComparacao(a, b)
sempre deve retornar o mesmo valor dado um par específico de elementosa
eb
como seus dois parâmetros. Se resultados inconsistentes são retornados, então a ordenação é indefinida.Fonte MDN: sort
let numeros = [ 5, 9, 2]
function funcaoDeComparacao(a, b) {
if (a < b) {
return -1 // ao retornar valor negativo, a ordem fica [a, b]
} else if (a > b) {
return 1 // ao retornar valor positivo, a ordem fica [b, a]
} else {
return 0 // ao retornar valor nulo, a ordem permanece [a, b]
}
}
numeros.sort(funcaoDeComparacao)
console.log(numeros) // [2, 5, 9]
Deixando mais conciso:
function funcaoDeComparacao(a, b) {
return a - b
}
numeros.sort(funcaoDeComparacao)
console.log(numeros) // [2, 5, 9]
Refatorando para JS moderno:
numeros.sort((a, b) => a - b)
console.log(numeros) // [2, 5, 9]
Obs: o método sort
altera o array original!
O método reduce
recebe uma função callback com alguns parâmetros e essa função é executada a cada elemento presente no array. O resultado é a redução do array a um valor só. Normalmente, utilizamos os dois primeiros parâmetros: acumulador
e itemAtual
.
Por exemplo, podemos executar a soma de todos os valores do array utilizando o método reduce
:
function somarTodos(acumulador, itemAtual) {
return acumulador + itemAtual
}
const numerosSomados = numeros.reduce(somarTodos)
console.log(numerosSomados) // 16
Deixando mais conciso:
const numerosSomados = numeros.reduce(function (acumulador, itemAtual) {
return acumulador + itemAtual
})
console.log(numerosSomados) // 16
Refatorando para JS moderno:
const numerosSomados = numeros.reduce((acumulador, itemAtual) => acumulador + itemAtual)
console.log(numerosSomados) // 16
-
Readline-sync é um pacote maravilhoso para pegar inputs no terminal, ou seja pegar entradas de dados no sistema. Se você veio de programação front-end isso equivale a pegar o value do input de um usuário num formulário.
-
Dentro da pasta de seu projetinho instale digitando o comando no terminal: npm install readline-sync
-
Nodemon é uma forma de executar o node atualizando automaticamente sempre que incluirmos e salvarmos novas informações nos arquivos.js
-
Dentro da pasta de seu projetinho instale digitando o comando no terminal: npm install nodemon
-
Crie o script start no package.json: "scripts": { "start": "nodemon app.js" }
-
Execute apenas uma vez: npm run start (após isso ele fica olhando nosso código e atualizando a execução do node)
Vamos criar um sistema que armazena informações de algumas alunas matrículadas no formato abaixo:
nome: string
idade: number
local: string
conteudoFavorito: string
Comportamento do sistema:
- deverá ser possível buscar alunas pela localidade
- caso a pessoa usuária escolha não buscar por localidade, deverá mostrar a tabela de alunas ordenada de forma crescente pela idade
Passo 1: npm init -y
Passo 2: npm i --save readline-sync
Passo 3: npm i --save-dev nodemon
Passo 4: crie o script de start
Passo 5: criar .gitignore
Passo 6: criar a database um array de objetos, não esquecer de exportar
Passo 7: criar o arquivo app.js
Passo 8: Rodar projeto npm run start
E bora codar!
Desafio entregavel:
Calma! É só uma TAREFINHA DE CASA pra chamar de sua! Já treinamos bastante com nossos exemplos na aula!
Vamos criar um sistema que armazena informações de livros para que seja possível gerenciar:
- os livros que já lemos e os livros que estão na nossa listinha de desejos
Passo a passo:
- Crie uma pasta que irá conter os arquivos abaixo:
- README.md
- app.js
- database.js
- Inicialize o npm : npm init -y
- Crie o script de start:
- Crie o script start no package.json: "scripts": { "start": "nodemon app.js" }
- Crie o .gitignore (node_modules)
- instale as dependências nodemon e readline-sync: npm i --save readline-sync nodemon
- No arquivo database crie e exporte a sua base no formato array de objetos contendo alguns dos livros que você já leu ou gostaria de ler com os seguintes campos:
nome: string
categoria: string
paginas: number
recomenda: boolean
leu: boolean
- No arquivo app.js desenvolva sua lógica para o comportamento abaixo:
-
deverá ser possível buscar livros pela categoria
-
Me recomenda livros pra ler? Deverá listar livros que já foram lidos e que são recomendados
-
Minha lista de desejo: Deverá listar livros que ainda não foram lidos
-
Caso a pessoa usuária não escolha uma forma de busca, deverá mostrar todos os livros cadastrados, ordenados de forma crescente por quantidade de páginas.
O comportamento esperado deve ser o pedido da entrada e a impressão das tabelas buscadas, conforme instrução acima.
-
No README.md você já sabe, conte sobre sua experiência e aprendizados com esse projeto.
-
A entrega é pelo classroom.