Métodos para eliminar duplicados en arrays de JavaScript

Uso de Map para desduplicación

El objeto Map permite eliminar duplicados en arrays, siendo especialmente útil para arrays de objetos mediante el uso de claves únicas.


function desduplicarConMap(datos) {
    const mapa = new Map();
    datos.forEach(elemento => {
        if (!mapa.has(elemento)) {
            mapa.set(elemento, true);
        }
    });
    return Array.from(mapa.keys());
}

const conjunto = [1, 2, 2, 3, 4, 4, 5];
console.log(desduplicarConMap(conjunto)); // Resultado: [1, 2, 3, 4, 5]

Ventajas: Complejidad O(n), eficiente para grandes volúmenes. Desventajas: Puede ser innecesario para datos primitivos simples.

Empleo de Set para una solución concisa

Set es una estructura de datos nativa de JavaScript que descarta duplicados de manera automática.


const extraerUnicos = (arreglo) => Array.from(new Set(arreglo));

const ejemplos = [1, 2, 2, 3, 4, 4, 5];
console.log(extraerUnicos(ejemplos)); // Resultado: [1, 2, 3, 4, 5]

Beneficios: Código breve y óptimo rendimiento. Limitaciones: No maneja directamente objetos complejos sin adaptación.

Aplicación de filter e indexOf

Este método filtra elementos manteniendo solo su primera aparición, verificando el índice con indexOf.


const filtrarDuplicados = (lista) => lista.filter((item, pos) => lista.indexOf(item) === pos);

console.log(filtrarDuplicados([1, 2, 2, 3, 4, 4, 5])); // Resultado: [1, 2, 3, 4, 5]

Adecuado para entornos que soporten ES5, aunque su complejidad O(n²) lo hace menos eficiente para arrays extensos.

Implementación con reduce para acumular únicos

Reduce construye un array acumulativo, incorporando elementos no previamente incluidos.


const reducirDuplicados = (coleccion) => coleccion.reduce((acumulador, valorActual) => {
    if (!acumulador.includes(valorActual)) {
        acumulador.push(valorActual);
    }
    return acumulador;
}, []);

console.log(reducirDuplicados([1, 2, 2, 3, 4, 4, 5])); // Resultado: [1, 2, 3, 4, 5]

Útil para arrays de objetos si se modifica la lógica de comparación, pero presenta complejidad O(n²).

Ordenamiento y filtrado para arrays secuenciales

Cuando el array ya está ordenado, se puede combinar ordenamiento y filtrado para mayor eficiencia.


const desduplicarSecuencial = (arreglo) => arreglo.sort((a, b) => a - b).filter((elem, idx, arr) => idx === 0 || elem !== arr[idx - 1]);

console.log(desduplicarSecuencial([5, 3, 3, 1, 2, 2, 4, 4])); // Resultado: [1, 2, 3, 4, 5]

Requiere preordenamiento, lo que puede incrementar la carga computacional, pero es eficaz para datos ya estructurados.

Comparativa de técnicas

Técnica Uso recomendado Mecanismo Complejidad temporal
Set Datos primitivos Desduplicación inherente O(n)
filter + indexOf Datos primitivos Búsqueda de primera ocurrencia O(n²)
reduce + includes Datos primitivos Acumulación progresiva O(n²)
Map Arrays de objetos Almacenamiento por clave O(n)

Para rendimiento superior con tipos simples, Set es óptimo. En casos con objetos complejos, Map ofrece flexibilidad mediante claves personalizadas.

Etiquetas: JavaScript Arrays set Map Filter

Publicado el 6-12 18:22