Manipulação de Arrays em JavaScript: Como Encontrar Interseção e Diferença com Set

Manipulação de Arrays em JavaScript: Como Encontrar Interseção e Diferença com Set

Comparar coleções de dados para identificar elementos duplicados ou exclusivos é um desafio comum na manipulação de listas. Utilizar a estrutura de dados Set combinada com o método .filter() permite realizar essas operações de forma limpa, declarativa e com excelente performance no JavaScript.

JavaScript

/**
 * Retorna os elementos presentes em ambos os arrays (Interseção).
 * @param {Array} arrA 
 * @param {Array} arrB 
 * @returns {Array}
 */
function obterIntersecao(arrA, arrB) {
  const setB = new Set(arrB);
  // Mantém apenas os itens de arrA que também existem em arrB
  return arrA.filter(item => setB.has(item));
}

/**
 * Retorna os elementos de arrA que NÃO estão em arrB (Diferença).
 * @param {Array} arrA 
 * @param {Array} arrB 
 * @returns {Array}
 */
function obterDiferenca(arrA, arrB) {
  const setB = new Set(arrB);
  // Mantém apenas os itens de arrA que não pertencem a arrB
  return arrA.filter(item => !setB.has(item));
}

// --- Exemplo Prático de Uso ---
const listaAtuais = ['JS', 'Python', 'Docker', 'K8s'];
const listaNovos = ['Docker', 'K8s', 'Go', 'Rust'];

// Elementos em comum
const comuns = obterIntersecao(listaAtuais, listaNovos);
console.log('Interseção:', comuns); // ['Docker', 'K8s']

// Elementos exclusivos da primeira lista
const exclusivosAtuais = obterDiferenca(listaAtuais, listaNovos);
console.log('Diferença (Atuais - Novos):', exclusivosAtuais); // ['JS', 'Python']

Pontos-chave

  • Otimização com Set.prototype.has(): Converter a segunda lista em Set garante buscas com complexidade $O(1)$, evitando o custo $O(n)$ de métodos como .includes().
  • Comparação de Tipos Primitivos: O método funciona nativamente para strings, números e booleanos, pois a comparação interna do Set utiliza a regra SameValueZero.
  • Atenção com Objetos e Referências: Para arrays de objetos, a comparação falhará a menos que sejam passadas as mesmas referências de memória; nesses cenários, utilize identificadores únicos (como id).
  • Complexidade Total $O(n + m)$: A abordagem combinada oferece performance significativamente superior em relação ao uso de .filter() encadeado com .includes(), que operaria em tempo quadrático $O(n \times m)$.

Thales de Oliveira Gomes

Thales de Oliveira Gomes é gestor de Tecnologia da Informação, especialista em infraestrutura de redes, computação em nuvem e operações de TI hospitalar, com mais de 18 anos de experiência na área. Graduado em Gestão de TI e pós-graduado em Engenharia de Redes e Telecomunicações, Cloud Computing, Redes de Computadores e Gestão Hospitalar, construiu uma trajetória sólida liderando projetos de alta complexidade, como a implementação e migração para nuvem de sistemas ERP de grande porte. Sua atuação no setor o levou a ser indicado ao prêmio IT Leaders Brasil na categoria Rising Leaders. Além da carreira corporativa e da paixão por tecnologia, Thales é autor independente com mais de 70 obras publicadas sobre redes, segurança da informação, Linux e física, além de criador de conteúdo no blog Vetor Tech e na plataforma CiberDicas. No universo das artes e do entretenimento, atua como produtor de música eletrônica sob o projeto Yknex, cria ilustrações digitais e compartilha walkthroughs de games no YouTube.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *