SEEK AND DESTROY (ELEMENTOS DUPLICADOS)

<script src=”my own” title=”algoritmos de b&uacute;squeda y eliminaci&oacute;n de elementos num&eacute;ricos repetidos”>

Algo tan sencillo en la programación, como tener un Array con elementos repetidos es tan común como tener acné o ir al baño…

Veamos, hay muchísimas formas de eliminar elementos duplicados en un Array, pero para no hacer el post tan largo, voy a irme por tres vías: usar VanillaJS (a.k.a. Javascript trocho y mocho), usar funciones propias de Javascript  prototipadas como map() o reduce(), o usar una librería externa.

Caso de estudio

Para no generalizar, voy a usar un Array numérico:

var arr = [1, 2, 31, 45, 7, 31, 2, 5, 7, 2];

Vía VanillaJS

Ordeno el arreglo y comparo cada elemento con el siguiente.

arr.sort(function(a, b){return a - b;});
for (var i = 0; i < arr.length; i++) {
  if(arr[i] === arr[i+1]){
    arr.splice(i--, 1);
  }
};
console.log(arr);

La función sort() ordenará el arreglo ascendente o descendentemente si la función pasada como parámetro retorna un valor positivo o negativo respectivamente. Lo demás es eliminar el elemento que se está comparando si corresponde con el próximo valor encontrado.

Vía funciones prototipadas

Uso la función prototipada reduce() para recorrer todo el arreglo, compararlo con los duplicados que se encuentren y mudarlos (una sola vez) a un nuevo arreglo.

var miarr = arr.reduce(function(a, elem) {
  if(a.indexOf(elem) === -1) {
    a.push(elem);
  }
  return a;
}, []);
console.log(miarr);

La función prototipada reduce() recibe varios parámetros, que dependiendo del contexto ayudan a lo mismo, esto es, reducir todos los elementos de un arreglo a un único valor, o al menos al retorno de un único valor.

Vía librerías externas

Las dos anteriores están muy bien, pero, si lo necesitamos para ayer ¿tiene sentido ponerse creativos? Pues, no. Afortunadamente existen varias librerías que hacen el trabajo pesado por nosotros, una de ellas es Underscore.js.

La incluímos en nuestro código HTML:

<script src="underscore.js"></script>

Y usamos la función uniq():

arr = _.uniq(arr);
console.log(arr);

Entendiendo que el caracter _ representa el espacio de nombres por el cual se rige la librería. Pero sobre esas cosas, y en especial sobre esta librería, hablaré más adelante en otro post.

Espero no duplicarme 😉

</script>

Anuncios

Un comentario en “SEEK AND DESTROY (ELEMENTOS DUPLICADOS)

Los comentarios están cerrados.