Estrutura De Dados Javascript - Array - Estrutura de dados com javascript - YouTube
Array - Estrutura de dados com javascript - YouTube

O que acontece quando você tenta organizar dados no JavaScript

JavaScript não vem com um banco de dados embutido. Você constrói suas próprias estruturas ou usa as que a linguagem já oferece. O problema é que a maioria das pessoas trata Array, Object e Map como se fossem intercambiáveis, e depois se pergunta por que o código fica lento quando o dataset cresce. Eu trabalhei em uma aplicação que precisava fazer lookup de mais de 200 mil registros em tempo real no front-end. A equipe estava usando objetos normais para tudo. As buscas demoravam segundos. Trocar para Map reduziu isso para milliseconds, mas só depois que entendi que a diferença não era só sintaxe.

estrutura de dados javascript na prática

Vamos começar pelo básico sem rodeio. Um Array é uma lista ordenada. Objetos são chaves e valores. Map é uma versão mais previsível de objeto para chaves não-string. Set é um Array que não permite duplicatas. Parecem simples até você precisar escolher o certo para o cenário certo. Array tem índice numérico e mantém ordem. Object tem chaves que viram string automaticamente, o que causa comportamentos estranhos se você passar números ou objetos como chave. Map preserva a ordem de inserção e aceita qualquer tipo de chave sem conversão. Set remove duplicatas e tem complexidade O(1) para verificação de pertinência.

Aqui está algo que poucos mencionam: quando você faz obj[key] onde key é um número, o JavaScript converte para string. Isso significa que obj[1] e obj["1"] são a mesma coisa. Se você precisa de distinção entre esses casos, use Map. Eu perdi duas horas debugando um bug assim em um sistema de permissões onde os IDs eram numéricos e alguns vinham como string de uma API mal documentada. Para lookup rápido, Map costuma ser mais performático que Object puro porque o engine otimiza melhor a busca por chave. Em benchmarks reais com 50 mil inserções e consultas, Map ficou em torno de 3x mais rápido que objeto literal. A diferença é mais evidente em navegadores mais antigos onde a otimização de objetos é menos agressiva.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Casos concretos e armadilhas

Set é útil quando você precisa verificar se um valor já existe sem manter um array e fazer .includes() repetidamente, que é O(n). Com Set, cada verificação é O(1). Eu usei isso em um validador de formulários que checava se um CPF já havia sido submetido durante a sessão. Substituir um array por Set reduziu o tempo de validação de cerca de 400ms para 12ms com 5 mil entradas. WeakMap e WeakSet existem e são importantes para garbage collection. A diferença crucial é que as chaves devem ser objetos e são referências fracas. Isso significa que se não houver mais referências ao objeto-chave fora do WeakMap, o entry pode ser coletado. Use isso para anexar metadados a elementos do DOM sem causar memory leak. Eu vi código em produção onde devs usavam Map comum para guardar referências a elementos e acabavam com memory leak porque nada nunca limparam essas referências.

Stack e Queue não são tipos nativos do JavaScript, mas você pode implementá-los com Array. Para stack, use push() e pop(). Para queue, use push() e shift(), embora shift() seja O(n) porque realoca todo o array. Se você precisa de queue performática, considere uma implementação com ponteiros ou use uma biblioteca como double-ended-queue. Em um scheduler de tarefas que processava filas grandes, o shift() genérico causava stuttering visível na UI a cada operação. Graph é o mais complexo de implementar do zero. Geralmente se representa com um objeto onde cada chave é um nó e o valor é um array de vizinhos, ou com um Map mapeando nodes para arrays de edges. Para caminhos mais curtos, implemente BFS ou Dijkstra. A parte que as pessoas subestimam é a detecção de ciclos. Sem um tracking adequado de nós visitados, seu algoritmo entra em loop infinito em grafos com ciclos.

Quando não usar estrutura nativa

Existem cenários onde as estruturas padrão do JavaScript simplesmente não cortam. Dados geoespaciais pedem Quadtree ou R-Tree. Dados ordenados com range queries precisam de árvores balanceadas como AVL ou Red-Black. Listas vinculadas encadeadas são raras no JavaScript do dia a dia porque Array já cobre 95% dos casos, mas ainda aparecem em implementações de cache LRU ou buffers de streaming. Para esses casos, bibliotecas como fast-json-stable-stringify para ordenação determinística, ou estruturas como o tree.js para grafos, podem economizar horas. Mas a maioria dos problemas no frontend e backend JavaScript se resolve com Array, Object, Map e Set combinados de forma inteligente.

O ponto que eu quero deixar claro é que escolher a estrutura errada não é só uma questão de estilo. É uma questão de complexidade algorítmica que se manifesta como lentidão real no navegador ou no Node. Não adianta ter o algoritmo mais bonito do mundo se ele roda sobre a estrutura de dados errada.