Eliminando valores duplicados en Javascript

El Problema: Backend me devuelve un gran número de strings. Pero necesito un array en el que cada string aparezca solamente una vez, eliminando todos los duplicados.

Me he encontrado varias soluciones por ahí… pero a decir verdad, ninguna me funciona como quiero. Es un problema común así que hay bastante lectura sobre el tema.

Las soluciones que encontré requerían de muchos bucles anidados, un sin fín de comparaciónes y en algunos casos expresiones regulares tan enredadas que le quemarían las neuronas a cualquiera.

No me mal entiendan… los que me conocen saben que amo las expresiones regulares, pero para este caso en particular, por lo enredado que podría ser y si planeo reutilizar el código, puede que no entienda nada cuando lo revisen de nuevo. [inserte aquí el chistecito que dice que hay 10 tipos de programadores, los que entienden Regexp y los que no... o ese no era?]

En fin, quería una solución simple, limpia y reutilizable, pero no pude encontrar nada.

Ni modo, a hacerlo como quiero.

Después de pensarlo un buen rato, tomarme un café y molestar a mis compañeros en la oficina, se me vino a la cabeza que ya existe algo en javascript que puede eliminar duplicados naturalmente, y después de tenerlo en la punta de los dedos por un rato me acordé: Los Object Keys.

Los objetos en Javascript son hashes, y estos están formados por dos partes, la izquiera y la derecha:

{"izquierda":derecha} // duh!

El key es único, pero desde luego, los valores pueden ser duplicados.

Y entonces se me ocurrió: El “key” es la llave (Sí, suena raro….). Lo que quiero decir es que todo lo que hay que hacer es recorrer los strings y asignarlos a los keys de un objeto. Los hashes son máquinas automáticas asesinas de duplicados.

Y funciona… Javascript elimina los duplicados naturalmente. Si bien el método funciona bastante bien y es rápido, te aconsejo que las cargas más pesadas las manejes en Back-end, un proceso muy pesado te colgaría el browser.

En fin… así queda la solución.

function eliminarDuplicados(a) {
  var i,
      l=a.length,
      o=[],
      ob={};  

  for (i=0;i<l;i++) {
    ob[a[i]]=0;
  }
  for (i in ob) {
    o.push(i);
  }
  return o;
}

Si bien, esta solución es en Javascript, da pié para poder interpretarlo y aprovechar la idea en otro lenguaje.

  • emcijey
    function eliminarDuplicados(object,key){
    var _object={};
    for(var _key in object){
    if(_key!=key){ _object[_key]=object[_key]; }
    }
    return _object;
    }

    más corta
  • Excelente, gracias por tu aporte al Blëg.

    Pura vida.
  • Mic
    Lo mismo pero un pelin mas corto...

    function eliminarDuplicados(a) {
    var idx = {}, ai, o=[];
    for(var i = 0, l = a.length; i < l; i++){
    ai = a[i];
    if(!idx[ai]){
    o.push(ai);
    idx[ai] = true;
    }
    }
    return o;
    }
  • w00t!, excelente… gracias por el approach!

    btw, cómo van las cosas con PURE? muy buen template engine, de lo mejor.
  • Mic
    Gracias para tu comentario sobre PURE.
    Como van las cosas... Pues poco a poco estoy estabilizando la nueva version y añadiendole el autoRendering. Pero he tenido bastante lios estas ultimas semanas.
blog comments powered by Disqus
  • Mail
  • Delicious
  • Digg
  • StumbleUpon
  • Twitter
  • Technorati