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 emSetgarante 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
Setutiliza a regraSameValueZero. - 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)$.
