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.
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.