CREATE e READ simples com MongoDB + NodeJS

Neste artigo criarei um CREATE e READ básico utilizando MongoDB e Node.js. Caso você não conheça o MongoDB, recomendo a leitura deste artigo que explica como realizar as operações CREATE, READ, UPDATE e DELETE no shell do MongoDB.

O MongoDB é um NoSQL. Com o Node.js, iremos acessar o banco de dados usando o node. Crie uma pasta chamada crud_mongo e abra-a no code. Abra o terminal do code para prosseguir com o artigo.

Precisamos instalar o driver oficial do MongoDB. Utilizando o NPM, vamos baixar o pacote do Mongo.

npm install mongodb

Pronto. Agora temos o pacote instalado na nossa aplicação. Com isso, já é possível manipular bases de dados do MongoDB com o Nodejs.

CRIANDO A BASE DE DADOS

Para criar o banco de dados, vamos fazer uma requisição de um objeto MongoClient, especificando o URL de conexão com o endereço do localhost, a porta a ser utilizada e passando o nome da base de dados a ser criada.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function(err, db){
    if (err) throw err;
    console.log("Banco de Dados criado!");
    db.close();
})

Execute o arquivo no seu servidor NodeJS. Você verá a mensagem: Banco de Dados Criado!

Observação: O banco de dados não é exatamente criado até que ele receba conteúdo. Vamos inserir conteúdo nesta base a seguir.

CRIANDO UMA COLEÇÃO

Para criar uma coleção na nossa base de dados, usaremos o método createCollection(). Neste médodo, passaremos o nome da coleção a ser criada.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    dbo.createCollection("clientes", function (err, res) {
        if (err) throw err;
        console.log("Coleção criada");
        db.close();
    });
});

E pronto, a nossa coleção foi criada!

INSERINDO DOCUMENTOS NA COLEÇÃO

Para inserir um documento (registro) na coleção, podemos utilizar o método insertOne() para registros simples, e insertMany() para registros múltiplos. Vamos realizar uma inserção de apenas um documento na nossa coleção:

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    let myObj = {
        name: "Usuario 1",
        endereco: "Rua teste 1"
    };
    dbo.collection("clientes").insertOne(myObj, function (err, res) {
        if (err) throw err;
        console.log("Documento inserido");
        db.close();
    });
});

Se você tentar inserir documentos em uma coleção inexistente, o MongoDB criará a coleção automaticamente.

READ (find())

Para selecionar os dados de uma coleção no Mongo, podemos utilizar os métodos findOne() e find(), que seleciona um dado e todos os dados da coleção, respectivamente. Utilize o método toArray para retornar os elementos em um vetor.

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    let dbo = db.db("mydb");
    dbo.collection("clientes").find({}).toArray(function (err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
});

E nosso retorno será:

Com isso, já sabemos inserir e pesquisar dados no MongoDB utilizando o NodeJS.

Referência: https://www.w3schools.com/nodejs/nodejs_mongodb.asp

Até o próximo artigo pessoal!

ES6: Default Parameters e Rest Parameter

O ECMAScript 6 foi a primeira atualização significativa para a linguagem desde o lançamento do ES5, que foi lançado em 2019. O Babel é uma ferramenta utilizada para pré-processar JavaScript, e nos permite usar algumas novas funcionalidades que ainda são experimentais, ou seja, estão em ambiente de testes. Atualmente, o ECMAScript já está em fase de experimentos da sua versão 2021, mas hoje, falaremos de duas importantes implementações do ES6: Default Parameters e Rest Parameter:

Default Parameters:

Para nos auxiliar na criação de funções mais flexíveis, o ES6 nos trouxe uma nova funcionalidade chamada Default Parameters para ser utilizada nas nossas funções. Por exemplo:
let saudacao = (nome = "Anônimo") => "Olá " + nome;
console.log(saudacao());
console.log(saudacao("Lúcio"));

// Olá Anônimo

// Olá Lúcio
O Default Parameter entra em ação quando você não especifica o argumento, ou seja, é indefinido. No nosso exemplo acima, o parâmetro nome recebe o valor padrão “Anônimo” quando você não fornece um valor como argumento.
Você pode passar mais valores padrão para quantos parâmetros você desejar:
let incrementar = (numero, valor = 8) => numero + valor;

console.log(incrementar(5));

// 13
Como você pôde perceber, o valor 8 não foi sobrescrito, trazendo 13 como resultado.

Rest Parameter

O ES6 também nos trouxe uma possibilidade de passar o Rest parameter como parâmetros de função, tornando possível a criação de funções que recebem um número variável de argumentos e esses argumentos são armazenados em um array que pode ser acessado posteriormente de dentro da função. O rest parameter elimina a necessidade de verificar a “args” e permite aplicar os métodos map(), reduce() e filter() no array de parâmetros.
Por exemplo, faremos uma função de multiplicação que receberá qualquer número nos seus argumentos e realizará uma multiplicação.
let multiplica = (...args) => {
    return args.reduce((a, b) => a * b, 1);
}

console.log(multiplica(10, 2, 10));

// 200

Com isso, vimos dois dos mais importantes recursos do JavaScript moderno que muita gente ainda desconhece. É importante sempre atualizar os seus conhecimentos da linguagem, pois ela está sempre em constante evolução, com novas funcionalidades, novos frameworks e bibliotecas para tornar seu código mais limpo, rápido e eficiente.

Gostou deste artigo? Comente abaixo!

Criando Pokedéx com React – Parte 2

Na parte 2 do nosso projeto, construiremos o layout básico do nosso projeto. Você precisará da Parte 1 para dar sequência neste artigo.

Wireframe:

O React tem a ver com construção de componentes. Então, a melhor maneira de fazer isso é criar wireframes para mapeamento dos componentes a serem construídos. O nosso aplicativo principal terá dois componentes: a visualização do Pokemón e a visualização dos detalhes.

O Pokemon view conterá um componente chamado PokeList que envolverá 151 PokeCélulas (da primeira geração de Pokemón). Ao clicar em uma PokeCélula, a visualização dos detalhes mostrará as informações e a sprite do Pokemón selecionado.

Tipos de componentes:

O React possui 2 tipos básicos de componentes: stateful (com estado) e stateless (sem estado). Os componentes Stateful têm seu próprio estado. No nosso aplicativo, o componente APP será Stateful, pois manterá o estado dos dados do Pokemón.

Vamos construir!

Abra o App.js e exclua todo o conteúdo interno. A primeira etapa é importar o pacote React e desconstruir a classe Component.

import React, { Component } from 'react';

Agora, precisamos criar um novo aplicativo que estenda o Componente. Todos os componentes Stateful requerem dois métodos principais:

  1. Construtor: onde inicializamos o nosso estado;
  2. Render: onde escrevemos nosso jsx.

No construtor, precisamos chamar a função super(), pois estamos estendendo da classe componente. Além disso, precisamos declarar nosso estado inicial. Por enquanto, será um objeto vazio.

import React, { Component } from 'react';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }
}

Adicionaremos o método render. Ele retorna a sintaxe jsx, que é uma mistura de JavaScript e HTML. O método render só pode retornar um elemento, portanto, criaremos um elemento pai e aninharemos filhos dentro dele. Se estamos retornando um elemento aninhado, envolveremos ele entre parênteses.

import React, { Component } from 'react';
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
    return (
      <div className = "App">

      </div>
    );
  }
}

Feito isso, importaremos nossa folha de estilo na parte superior para adicionar o CSS do nosso componente e exportar toda a classe para que possamos usá-la em outros arquivos.

import React, { Component } from 'react';
import './styles/App.css'
class App extends Component {
  constructor() {
    super();
    this.state = {};
  }

  render() {
    return (
      <div className = "App">

      </div>
    );
  }
}

export default App;

Abra o seu arquivo App.css e adicione o seguinte css:

.App {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 650px;
    height: 400px;
    padding-left: 10px;
    margin: 50px auto;
    background-color: #FE0065;
    border-radius: 10px;
    box-shadow: 0 14px 45px rgba(0, 0, 0, 0.22), 0 18px 45px rgba(0, 0, 0, 0.22);
}

 

  1. Usamos o display: flex para separar as duas visualizações que construiremos;
  2. Fixamos a largura e altura para a tela do desktop;
  3. Aplicamos margem superior e inferior para separar a vista dos cantos e esquerda e direita automaticamente para coloca-los no meio;
  4. Aplicamos cor ao fundo.

Com isso, concluímos a Parte 2! Até a próxima!

Referências: https://blog.cloudboost.io/lets-build-a-pokedex-with-react-part-2-3d119b07f9e0

Exercício fácil: async e await

Async e await são extensões das promises. Quando uma função assíncrona é chamada, ela retorna uma promise. Uma função assíncrona pode conter uma palavra-chave await, que pausa a execução da função e espera pela resolução da promise passada, retomando a execução após a resolução da promise e retornando o valor resolvido. A proposta das funções async/await é simplificar o uso de promises. Assim como promises são similares a callbacks estruturados, as funções async/await são similares à junção de generators com promises. Caso você não conheça o async/await, recomendo que antes de prosseguir, leia este artigo: Entenda o async e await.

Dito isto, vamos ao exercício:

Passo 1:

Crie uma função que após 5 segundos, dobre o resultado do número passado como parâmetro. Essa função deverá retornar uma promise. Use o setTimeOut como temporizador.

O corpo da função abaixo servirá como base para este exercício:

function dobrarEm5Segundos(x) {
  return new Promise( => {
    setTimeout(() => {      
    });
  });
}

Realizado este passo, podemos seguir adiante:

Passo 2:

Crie uma função assíncrona que irá receber um parâmetro x. Crie três variáveis: a, b e c dentro do corpo da função. Cada uma dessas variáveis receberá um await da função do passo anterior. Você deve passar como parâmetros dessa função os número 10, 20 e 30, respectivamente.

Retorne a soma de todos esses elementos, inclusive o parâmetro da função assíncrona.

async function addAsync(x) {
  let a;
  let b;
  let c;
  return;
}

Para mostrar o resultado no console, utilize o .then():

addAsync().then(() => {
  console.log();
});

Você pode realizar o download do exercício resolvido aqui:

[download id=”3580″]

Gostou deste exercício? Comente abaixo:

Conheça o Callback Hell e como evitá-lo

Conheça o Callback Hell

JavaScript assíncrono, ou JavaScript que usa callbacks, é complicado de acertar intuitivamente. A causa do call-back hell é quando as pessoas escrevem JavaScript de uma maneira que ocorre a execução de cima para baixo, visualmente falando. Em algumas outras linguagens, como C, Python, existe a expectativa de que o que quer que aconteça na linha 1, tenha que terminar antes que o código da linha 2 execute, e assim por diante. Mas no JavaScript, isso funciona de uma maneira diferente.

O que são Callbacks?

São apenas o nome de uma convenção para o uso de funções JavaScript. Não existe nada chamado “callback” no JavaScript, sendo apenas uma convenção. Em vez de utilizar retorno imediato como a maioria das funções. As funções call-back demoram algum tempo para produzir resultados. A palavra “assincronismo”, conhecida no JavaScript como “async”, significa “demora algum tempo / acontece no futuro”.

Quando você chama uma função normal, pode usar seu valor de retorno:

let resultado = multiplicarDoisNumeros(5, 10);

console.log(resultado);

No entanto, funções assíncronas e que usam call-backs não retornam nada imediatamente:

let foto = downloadFoto('http://coolcats.com/cat.gif')

// foto é 'undefined'!

Nesse caso, o gif pode demorar muito para ser baixado e você não deseja que seu programa seja pausado enquanto aguarda a conclusão do download. Em vez disso, você armazena o código que deve ser executado logo após a conclusão do download em uma função. Este é o callback. Você executa a função downloadFoto e ele executará seu callback, quando o download estiver concluído e passará a foto (ou um erro se algo der errado).

downloadFoto('http://coolcats.com/cat.gif', lidarComFoto)

function lidarComFoto (error, foto) {
  if (error) console.error('Erro de Download!', error)
  else console.log('Download finished', foto)
}

console.log('Download iniciado')

Como podemos evitar o callback hell?

  1. Mantenha seu código limpo:

Callback hell geralmente é causado por más práticas de codificação. Escreva melhor o seu código e não passará trabalho.

let form = document.querySelector('form');
form.onsubmit = function formSubmit (submitEvent) {
    let name = document.querySelector('input').value;
    request({
        uri: "http://example.com/upload",
  body: name,
        method: "POST"
        }, function postResponse (err, response, body) {
        let statusMessage = document.querySelector('.status');
  if (err) return statusMessage.value = err;
  statusMessage.value = body;
    })
}

Nomear funções é uma prática benéfica e facilita a leitura do código.

Agora podemos mover as funções para o nível superior do nosso programa:

document.querySelector('form').onsubmit = formSubmit;

function formSubmit (submitEvent) {
  let name = document.querySelector('input').value;
  request({
    uri: "http://example.com/upload",
    body: name,
    method: "POST"
  }, postResponse)
}

function postResponse (err, response, body) {
  let statusMessage = document.querySelector('.status');
  if (err) return statusMessage.value = err;
  statusMessage.value = body
}
  1. Modularize:

Segundo Isaac Schlueter (do projeto Node.js): “Escreva pequenos módulos que cada um faz uma coisa e monte-os em outros módulos que fazem uma coisa maior. Você não terá um callback hell se não for lá”.

Criando um módulo, ficaria assim:

module.exports.submit = formSubmit

function formSubmit (submitEvent) {
  let name = document.querySelector('input').value;
  request({
    uri: "http://example.com/upload",
    body: name,
    method: "POST"
  }, postResponse)
}

function postResponse (err, response, body) {
  let statusMessage = document.querySelector('.status');
  if (err) return statusMessage.value = err;
  statusMessage.value = body;
}
  1. Lide com todos os erros:

Existem diferentes tipos de erros: de sintaxe, de runtime, erro de permissões, falha no disco rígido, entre outros. Ao lidar com callbacks, você, por definição, está lidando com tarefas despachadas, executa algo em segundo plano e, em seguida, conclui com êxito ou aborta devido a alguma falha. Podemos manipular isso deixando o primeiro argumento da função callback reservada ao erro.

function lidarComFoto (error, foto) {
  if (error) console.error('Erro de Download!', error)
  else console.log('Download finished', foto)
}

Dito isto, sempre lide com todos os erros e mantenha seu código simples e limpo.

Para maiores informações, acesse o site: http://callbackhell.com/

Referências: http://callbackhell.com/

Cargos de TI no Brasil precisando de profissionais

Atualmente os CIOs (chief Information Officers; também conhecido como o chefão da area de tecnologia em empresas grandes) estão tendo que assumir maior responsabilidades mais complexas e que vão além do desenvolvimento de sistemas e infraestrutura de redes da empresa. Agora eles precisam se preocupar mais com coisas como segurança cibernética, ciência e análise de dados (Data Science) e aprendizado de máquina e inteligência artificial (Artificial Intelligence). Com essa mudança, novas vagas de emprego começam a ser mais requisitadas e com isso a necessidade de profissionais especializados que consigam preencher tais vagas.

Tendo isso em menste, foi feita uma pesquisa que entrevistou 679 diretores de TI e 250 líderes de TI de linha de negócios, eles informaram que em 2020 as prioridades são:

  • aumentar a eficiência operacional (37%)
  • melhorar a experiência do cliente (35%)
  • Aumentar as proteções de segurança cibernética (33%)
  • transformar os processos de negócios (30%)
  • melhorar a lucratividade (24%)

Essas mudanças estão ditando novas demandas por talentos. O que permanece o mesmo, no entanto, é que a competição por profissionais qualificados continua aumentando, principalmente em áreas como cibersegurança, segundo John McKnight, vice-presidente executivo de serviços de pesquisa do Enterprise Strategy Group.

Embora a ciência e a análise de dados permaneçam escassas, as habilidades em cibersegurança ocuparam o primeiro lugar na pesquisa deste ano, com 39% dos líderes de TI prevendo dificuldade em encontrar talentos neste ano, ante 33% em 2019. Outras mudanças notáveis: o design thinking, o DevOps e as habilidades ágeis são todos percebidos como desafios crescentes para contratação no próximo ano, em parte por conta da abordagem de concentração em produto e cliente.

Confira as 12 áreas que serão mais desafiadoras para encontrar talentos em 2020:

  • Cibersegurança: 39%
  • Ciência de dados / análise: 35%
  • IA / aprendizado de máquina / RPA: 31%
  • Serviços / integração em nuvem: 18%
  • Tecnologias herdadas: 18%
  • DevOps / DevSecOps / processos ágeis: 17%
  • Internet das coisas: 17%
  • Arquitetura em nuvem: 16%
  • Design thinking / UX: 16%
  • Engenharia de software: 15%
  • Desenvolvimento de aplicativos: 15%
  • Gerenciamento multi cloud: 15%

Com isso você pode ver que diversas áreas que já vem sido mencionadas por diversos sites e mídias focadas na área de tecnologia; Lecionadas nas universidades e cursos do Brasil estão ficando mais fortes no mercado de trabalho. Se você está na duvida sobre qual ramo da Ciêcia/Engenharia da Computação seguir ou até mesmo se você já é trabalha com TI mas está pensando em trocar de área de especialização, vale a pena dar uma olhada nestas áreas que foram mencionadas. Boa sorte.

fonte:

https://cio.com.br/os-12-cargos-de-ti-mais-dificeis-de-serem-preenchidos-nas-empresas/

 

Como quebrar um vetor grande em vários menores

Neste artigo veremos duas funções que leem um vetor e devolvem um outro dividido em pedaços menores. O exemplo será bem simples pois a aplicação é a mesma para 5 o para 5 bilhões de registros. 

A primeira função será genérica e você provavelmente poderá utilizá-la em outras linguagens com pouca ou nenhuma adaptação. Já a segunda é utilizando mais das funções do JavaScript para reduzir o código

Em resumo queremos que um vetor linear seja quebrado em vários pequenos vetores. No meu caso, eu precisava que uma lista de contatos fosse quebrada em diversas listas menores para facilitar o controle e atualização das mesmas.

Iremos de algo assim:

let vetor = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];

Para algo assim:

let vetor = [[0, 1, 2], 
             [3, 4, 5], 
             [6, 7, 8], 
             [9, 10, 11], 
             [12, 13, 14], 
             [15, 16]];

Como podemos fazer isso? Bom, a primeira forma é a seguinte:

Algoritmo Genérico

  1. Criar a função e inicializar as variáveis. Observe que novoVetor é um vetor com um vetor vazio dentro dele.
    function converterVetor(vetor, tamanho) {
        let novoVetor = [[]];
        let novoIndice = 0;
        let novoIndiceSub = 0;
    }
  2. Criar um laço FOR para adicionar os elementos no novoVetor. Observe que:
    1. Precisamos de um IF para testar a hora de avançar de um sub-vetor para outro.
    2. Dentro deste IF é necessário criar um vetor em branco para que o Javascript saiba o tipo do dado.
    3. No final, você está adicionando o valor dentro de um vetor que está dentro de outro vetor, então é preciso usar [x][y] para adicionar na posição correta.
    for(let indice = 0; indice < vetor.length; indice++){
    
        if(indice % tamanho == 0 && indice != 0){
            novoIndice++;
            novoVetor[novoIndice] = [];
            novoIndiceSub = 0;
        }
    
        novoVetor[novoIndice][novoIndiceSub] = vetor[indice];
        novoIndiceSub++;
    }
  3. Por ultimo, basta retornar o resultado. Veja abaixo o código completo.
    function converterVetor(vetor, tamanho) {
        let novoVetor = [[]];
        let novoIndice = 0;
        let novoIndiceSub = 0;
    
    
        for (let indice = 0; indice < vetor.length; indice++) {
    
            if (indice % tamanho == 0 && indice != 0) {
                novoIndice++;
                novoVetor[novoIndice] = [];
                novoIndiceSub = 0;
            }
    
            novoVetor[novoIndice][novoIndiceSub] = vetor[indice];
            novoIndiceSub++;
        }
    
        return novoVetor;
    }

Usando mais recursos JavaScript

Agora vejamos a mesma função, mas usando mais recursos JavaScript para reduzir um pouco o trabalho.

  1. Iniciaremos de forma muito parecida, mas precisaremos de uma variável a menos
    function converterVetor2(vetor, tamanho) {
        let index = 0;
        let novoVetor = [];
    }
  2. Agora faremos o loop for, mas ao invés de percorremos o loop original de 1 em 1, percorreremos o tamanho que já queremos colocar no sub-vetor.
    1. Dentro do loop, usaremos a função slice() que nos retornará um pedaço do vetor. Sendo ele o tamanho exato do sub-vetor.
    2. Após, adicionamos o subVetor ao novo com o método push() que adiciona um elemento na ultima posição.
    for (index = 0; index < vetor.length; index += tamanho) {
        let subVetor = vetor.slice(index, index + tamanho);
        novoVetor.push(subVetor);
    }
  3. Pronto!! Basta retornar o objeto com o resultado. Segue abaixo o código completo.
    function converterVetor2(vetor, tamanho) {
        let index = 0;
        let novoVetor = [];
    
        for (index = 0; index < vetor.length; index += tamanho) {
            let subVetor = vetor.slice(index, index + tamanho);
            novoVetor.push(subVetor);
        }
    
        return novoVetor;
    }

Conclusão

Como você pode ver, o segundo formato é um pouco menos detalhado, mas utilizando os recursos do JavaScript é possível escrever menos código que ainda é fácil de entender. Por isso que, quando você estuda uma linguagem, é importante conhecer as funções nativas e formas mais inteligentes de trabalhar com seus objetos.

Dica rápida: Livros para aprender JavaScript

Olá, neste artigo irei mostrar três livros que possuem ótimas referências e excelente didática para você aprender JavaScript!

Existem diversas formas de aprender programação atualmente. Cursos, artigos, diversos sites e grupos específicos de programação. Você até mesmo consegue aprender a programar em vídeos disponíveis no YouTube, além de ter a possibilidade de aprender a linguagem diretamente na documentação. Mas nada como o bom e velho livro, não é mesmo?

Vamos lá:

Use a cabeça! Programação JavaScript.

Este livro ensina tudo sobre a linguagem JavaScript, desde os tópicos mais básicos até os mais avançados. Isto inclui: objetos, funções e o DOM. No livro, você jogará jogos e resolverá muitos quebra-cabeças para interagir com o JavaScript de diversas formas. Você irá escrever códigos de verdade para que possa criar suas próprias aplicações web. O livro utiliza um formato visualmente rico.

Editora: Alta Books

 

JavaScript: O Guia Definitivo

O guia definitivo de JavaScript oferece uma descrição muito ampla de funcionalidades do JavaScript, bem como de APIs JavaScript client-side definida pelos navegadores. Abrange o ECMAScript 5 e HTML5. É recomendado para quem deseja aprender a linguagem JavaScript e para programadores JS que já dominam a linguagem e querem ampliar seus conhecimentos.

Editora: Bookman

 

Estrutura De Dados e Algoritmos Com JavaScript

Este livro ensina a base de estrutura de dados e algoritmos para você aprender a escrever códigos complexos e eficazes utilizando os mais novos recursos da ES. O livro começa abordando o básico sobre JavaScript e apresenta as estruturas de dados mais importantes, como arrays, filas, pilhas e listas encadeadas. Você terá conhecimento sobre tabelas hash e você também terá compreensão de como os grafos são utilizados. Aprenderá a ordenar as estruturas de dados usando algoritmos como bubble sort, merge sort, quick sort, entre outros; E também a realizar pesquisas de elementos em estruturas de dados usando a ordenação sequencial e a busca binária.

Gostou deste artigo? Comente abaixo outros livros que você indica!

Estrutura de Dados com JavaScript: Lista Encadeada

Listas encadeadas são estruturas de dados feitas de grupos de nós que juntos representam uma sequência. Você notará que a Fila e a Pilha foram criadas usando a ideia básica de uma lista encadeada. No entanto, eles têm regras especiais que os tornam diferentes em funcionalidade.

function ListaEncadeada() {
    let contador = 0;
    let head = null;

    this.GetCount = function(){
        return countador;
    }

} 

Nossa lista encadeada terá 6 métodos adicionais: DisplayAll (), DisplayAt (índice), AddFirst (dados), Add (dados, índice), RemoveFirst (), RemoveAt() .

DisplayAll():

Descrição:

O nome já diz tudo. Retorna um array com os dados ou, se vazio, retorna nulo.

this.DisplayAll = function() {
    // se está vazio
    if (head === null) {
        return null;
    } else {
        //senão, percorre a lista e a coloca em um array.
        let arr = new Array();
        let atual = head;

        for (let i = 0; i < contador; i++) {
            arr[i] = atual.dado;
            atual = atual.próximo;
        }
        return arr;
    }
}

DisplayAt():

Descrição:

Como o método PeekAt (indice) anterior da Fila, é exibido em um índice específico ou, fora dos limites, ele retorna null.

this.DisplayAt = function(indice) {
    // verifique se há valores fora dos limites
    if (indice > -1 && indice < contador) {
        let atual = head;
        let i = 0;

        // não fui eu, é da nczonline (veja fonte).
        // É uma maneira diferente de implementar o FOR que estamos usando
        // e eu queria que todos tivessem a chance de conhecê-lo.
        while (i++ < indice) {
            atual = atual.proximo;
        }

        return atual.dado;
    } else {
        return null;
    }
}

AddFirst():

Descrição:

Adiciona à frente da lista. Se você está se perguntando, frente é onde o índice é 0 e referenciado pelo cabeçalho.

this.AddFirst = function(dado) {
    // Cria um novo nó
    let node = {
        dado: dado,
        proximo: head
    };

    head = node;
    contador++;
}

Add()

Descrição:

Adiciona um item à lista na posição especificada.

this.Add = function(dado, indice) {
    // se o índice escolhido for 0, faça o método AddFirst (dado).
    if (indice === 0) {
        this.AddFirst(dado);
    }
    // verifique se há valores fora dos limites
    else if (indice > -1 && indice < contador) {
        let node = {
            dado: dado,
            proximo: null
        };

        let anterior;
        let atual = head;
        let i = 0;

        // encontre o local certo
        while (i++ < indice) {
            anterior = atual;
            atual = atual.proximo;
        }

        anterior.proximo = node;
        node.proximo = atual;

        contador++;
    } else {
        alert("fora de alcance");
    }
}

RemoveFirst()

Descrição:

Remove o primeiro item.

this.RemoveFirst = function() {
    // se não há itens na lista, retorna nulo
    if (head === null) {
        return null;
    } else {
        let out = head;
        head = head.proximo;

        if (contador > 0) {
            contador--;
        }

        return out.dado;
    }
}

RemoveAt()

Descrição:

Remove um item de um índice específico.

this.RemoveAt = function(indice) {
    if (indice === 0) {
        return this.RemoveFirst(indice);
    }
    // verifique se há valores fora dos limites
    else if (indice > -1 && indice < contador) {

        let atual = head;
        let anterior;
        let i = 0;

        // encontre a localização correta
        while (i++ < indice) {
            anterior = atual;
            atual = atual.proximo;
        }

        // pule o item para remover
        anterior.proximo = atual.proximo;

        // diminuir o comprimento
        contador--;
    } else {
        return null;
    }

    // retorna o valor
    return atual.dado;
}
  • DISPLAYALL():
  • DISPLAYAT(INDICE):
  • ADDFIRST(DADO):
  • ADD(DADO,INDICE):
  • REMOVEFIRST():
  • REMOVEAT(INDICE):

Gostou deste artigo? Comente abaixo!