• #Aplicaciones
  • #Bases de datos
  • #Dispositivos
  • #Hardware
  • #Inversión
  • #Marketing
  • #Programacion
  • #Sistemas
  • Cómo encontrar los elementos duplicados en un array con JavaScript

    TutorialesJavascriptProgramacion

    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.

    Deja una respuesta

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