Cómo encontrar los elementos duplicados en un array con JavaScript

Javascript

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.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

6 comentarios en “Cómo encontrar los elementos duplicados en un array con JavaScript

  1. Excelentes ejemplos! No lo he probado con Js ya que lo necesitaba para PHP, es posible que en esta parte de tu código:

    for (let i = 0; i < tempArray.length; i++) {
    if (tempArray[i + 1] === tempArray[i]) {
    duplicados.push(tempArray[i]);
    }
    }

    Al final del array lance un error "Undefined offset" ? porque al menos en PHP con este código usando tu misma lógica lo lanza, mira mi código:

    $j = 1;

    for ($i = 0; $i < count($results); $i++)
    {
    $newIndex = ($i === (count($results) – 1)) ? ($i – 1) : $i; // Me veo obligado al final reacomodar el index.

    if ($results[$i + 1]['code'] === $results[$i]['code'])
    {
    $j++;
    }
    else
    {
    $j = 1;
    }
    }

    Según length en Js hace lo similar que count() en PHP, leyendo la documentación https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/length , por lo cual lanza un número entero con la cantidad de ítems de un array, pero el índice comienza en 0.

    Bueno es solo un comentario para saber si me pasa a mí solamente o realmente sucede.

    Muchas gracias por tu aporte, me ha servido muchísimo! Saludos!

  2. HOLA! Gracias por compartir tus conocimientos.
    Como se haría para filtrar el primer ejemplo de #2 Encuentra objetos duplicados , para que aparezcan todos: Marta, Manuel y Edu( pero siendo Edu el de la edad mas alta o mas baja)?

  3. Ingeniero muy bueno su aporte , GRACIAS. yo necesito invertir esta lógica o más bien obtener el resultado opuesto. Un nuevo array de objetos. Pero que me filtre el que no se está repitiendo. Intenté de invertir la función con el operador != , pero no lo conseguí. Me podrá decir como poder invertirlo. Muchas gracias.

  4. Hola, no funciona correctamente ya que solo sirve si hay numeros duplicados. Si hay triplicado devuelve 2 veces el mismo número, etc.

Responder a Nicolás Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”