Eliminar duplicados de un vector JavaScript

Publicado el 04 noviembre 2020 por Daniel Rodríguez @analyticslane

Localizar los valores únicos que contiene un vector es una tarea con la que posiblemente nos encontremos de forma habitual. Algo que ya hemos visto cómo solucionar en Python y en Excel. A continuación, vamos a ver tres métodos para eliminar los valores duplicados de un vector JavaScript y comparar su rendimiento.

forEach

Quizás el método más sencillo para obtener los valores únicos de un vector es iterar sobre él e ir guardando los valores nuevos en una nueva variable. Al final la nueva variable contendrá los valores únicos. Esto se puede hacer iterando con el método forEach() y buscar los valores nuevos con includes(). Métodos que se encuentran en todos los vectores JavaScript. Así se posible encontrar los valores únicos simplemente con el siguiente código

let values = [1, 4, 2, 2, 6, 1, 7, 4]

let unique = []

values.forEach(name => {
	if(!unique.includes(name)) {
		unique.push(name);
	}
})

console.log(unique);
[ 1, 4, 2, 6, 7 ]

Al sacar el vector a través de la consola se puede ver que solamente se encuentran los valores únicos, eliminado los duplicados

filter

Otro método que puede ser también intuitivo es filter(), con el que podemos filtrar los vectores. Así para eliminar los duplicados solamente necesitamos encontrar los valores cuyo índice se corresponda con la primera aparición en la lista. Posición que se puede obtener fácilmente con el método indexOf(). Así, otro código con el que se pueden obtener los valores únicos es el siguiente.

unique = values.filter((v,i) => values.indexOf(v) === i)
console.log(unique);
[ 1, 4, 2, 6, 7 ]

Un método que es más compacto que el anterior.

Set

Finalmente, otro método puede ser convertir el vector original en un Set y volver a convertir este en vector. Lo que nos dará otra vez los valores únicos del original. Algo tan sencillo como la siguiente línea.

unique = [...new Set(values)];
console.log(unique);
[ 1, 4, 2, 6, 7 ]

Comparación de rendimiento

Hemos visto tres formas de ordenar los valores únicos en un vector de JavaScript. Pero, si vamos a trabajar con vectores grandes, es importante saber cuál es el más rápido de los tres métodos. Algo que se puede comparar comprobando el rendimiento con un vector de 10 millones de registros y midiendo el tiempo que tarda cada uno de los métodos que hemos visto.

values = Array(10000000).fill().map(_ =>  Math.round(Math.random() * 10));

let start = new Date();

values.forEach(name => {
	if(!unique.includes(name)) {
		unique.push(name);
	}
})

let end = new Date() - start;
console.log(`Tiempo de ejecución forEach: ${end} ms`);

start = new Date();

unique = values.filter((v,i) => values.indexOf(v) === i)

end = new Date() - start;
console.log(`Tiempo de ejecución filter: ${end} ms`);

start = new Date();

unique = [...new Set(values)];

end = new Date() - start;
console.log(`Tiempo de ejecución Set: ${end} ms`);
Tiempo de ejecución forEach: 371 ms
Tiempo de ejecución filter: 390 ms
Tiempo de ejecución Set: 181 ms

Con lo que se puede concluir que el método más rápido es Set tarda menos de la mitad que forEach y filter, ambos en valores muy próximos. Por lo que, para grandes vectores, es aconsejable usar Set en lugar de los otros métodos.

Conclusiones

Hemos visto tres métodos para eliminar valores duplicados de un vector JavaScript y comprobar cuál de ellos es más rápido. Posiblemente forEach y filter sean los más intuitivos, pero no son los más eficientes a la hora de trabajar con grandes conjuntos de datos. Aunque todos ellos son rápidos, ya que pueden procesar diez millones de registros en pocos milisegundos.

Imagen de alessandra barbieri en Pixabay