En este tutorial vamos a ver cómo puedes encontrar los elementos de un array que están repetidos, algo muy habitual cuando, por ejemplo, quieres eliminar los elementos repetidos. Podemos lograrlo de varias formas.
Encuentra elementos duplicados
El método más sencillo, aunque no sea aplicable a todos los casos, consiste en ordenar el array, recorrer cada uno de los elementos y comprobar si el siguiente elemento es igual al elemento al actual. Sin embargo, este primer método solamente funciona con arrays que contengan elementos primitivos y no objetos.
En el siguiente ejemplo partimos del array numeros
. Lo que hacemos es crear el array duplicados
, vacío en un principio, que es en donde almacenaremos los elementos duplicados. Seguidamente, propagamos los elementos del array numeros
mediante el operador spread de propagación en un nuevo array que ordenamos mediante el método sort
para luego asignar el resultado al array tempArray
, que usaremos temporalmente.
Luego recorremos los elementos del array tempArray
, comprobando si cada uno de ellos es igual al siguiente elemento del array. Si son iguales, significará que el elemento está duplicado, por lo que lo agregamos al array duplicados
.
const numeros = [1, 2, 2, 3, 4, 4, 5];
let duplicados = [];
const tempArray = [...numeros].sort();
for (let i = 0; i < tempArray.length; i++) {
if (tempArray[i + 1] === tempArray[i]) {
duplicados.push(tempArray[i]);
}
}
console.log(duplicados); // [2, 4]
Vamos a ver ahora otro método que consiste en usar primero la estructura Set para eliminar los elementos duplicados, ya que este tipo de estructura almacenan sus valores como claves, impidiendo que los elementos se dupliquen. Este método funcionará únicamente con tipos primitivos:
const numeros = [1, 2, 2, 3, 4, 4, 5];
const numerosUnicos = [...new Set(numeros)]; // Array sin duplicados
let duplicados = [...numeros]; // Creamos una copia del array original
numerosUnicos.forEach((numero) => {
const indice = duplicados.indexOf(numero);
duplicados = duplicados.slice(0, indice)
.concat(duplicados.slice(indice + 1, duplicados.length));
});
console.log(duplicados); // [ 2, 4 ]
Encuentra objetos duplicados
Antes de obtener los objetos duplicados de un array debemos decidor qué es un objeto duplicado, en donde nos encontramos dos escenarios. Dos objetos podrían considerase como duplicados cuando se repite el valor de una única propiedad o cuando se repiten todos los valores de todas sus propiedades.
En el siguiente ejemplo vamos a obtener los objetos duplicados de un array cuando se repite una única propiedad, que será la propiedad nombre
del array personas
. Para ello usaremos el método reduce
, usando su acumulador para crear un array que contenga cada uno de los arrays cuya propiedad nombre
sea coincidente. Al array resultante le llamamos busqueda
:
const personas = [
{ nombre: 'Edu', edad: 35 },
{ nombre: 'Manuel', edad: 37 },
{ nombre: 'Marta', edad: 42 },
{ nombre: 'Edu', edad: 25 },
];
const busqueda = personas.reduce((acc, persona) => {
acc[persona.nombre] = ++acc[persona.nombre] || 0;
return acc;
}, {});
const duplicados = personas.filter( (persona) => {
return busqueda[persona.nombre];
});
console.log(duplicados);
/*
[
{ edad: 35, nombre: "Edu" },
{ edad: 25, nombre: "Edu" }
]
*/
Ahoora vamos a obtener los objetos duplicados de un array cuando se repite una única propiedad, que será la propiedad nombre
del array personas
. Para ello vamos a usar el método JSON.stringify
, para transformando cada objeto en una cadena que contenga todas las propiedades del objeto. A diferencia de usar una propiedad como clave del acumulador, ahora usaremos una cadena completa:
const personas = [
{ nombre: 'Edu', edad: 25 },
{ nombre: 'Manuel', edad: 37 },
{ nombre: 'Marta', edad: 42 },
{ nombre: 'Edu', edad: 25 },
{ nombre: 'Edu', edad: 35 },
];
const busqueda = personas.reduce((acc, persona) => {
const clave = JSON.stringify(persona);
acc[clave] = ++acc[clave] || 0;
return acc;
}, {});
const duplicados = personas.filter( (persona) => {
return busqueda[JSON.stringify(persona)];
});
console.log(duplicados);
/*
[
{ edad: 25, nombre: "Edu" },
{ edad: 25, nombre: "Edu" }
]
*/
Y esto ha sido todo.