Hola:
Por aportar algo. Si vamos a buscar distintos elementos en un array muy grande, lo mejor sería utilizar la sentencia
elem in elArray, que es instantánea. Pero eso sólo se nos permite hacerlo si
elem es
índice de algún elemento del array (sólo devolverá
true en caso de que exista ese índice).
Para ello podemos crear un array auxiliar con nuestros valores como índices (siempre que no modifiquemos el original sin modificar el nuevo).
Éste sería el test del método normal:
Código PHP:
Array.prototype.in_array=function(elem){
for(var j in this){
if(this[j]==arguments[0]){
return true;
}
}
return false;
}
var arr = new Array(); // declaramos
for(var i=0; i<100000; i++) // rellenamos con números aleatorios
arr[i] = Math.random();
// BÚSQUEDA i
for(var i=0; i<6; i++) {
ini = new Date().getTime(); // inicializamos la medida de tiempo
existe = arr.in_array( Math.random() ); // buscamos un elemento al azar
tiempoTotal = new Date().getTime()-ini;
e("Existe: "+existe+"; he tardado "+tiempoTotal+"ms en buscarlo.");
}
Cita:
Iniciado por output Existe: false; he tardado 4016ms en buscarlo.
Existe: false; he tardado 3859ms en buscarlo.
Existe: false; he tardado 3781ms en buscarlo.
Existe: false; he tardado 3906ms en buscarlo.
Existe: false; he tardado 3907ms en buscarlo.
Existe: false; he tardado 3812ms en buscarlo
Y el tiempo total ha sido de 23281ms, una burrada.
Sin embargo si utilizamos el array convertido del que hablo...
Código PHP:
Array.prototype.in_array=function(elem){
if( !this.convertido ) {
this.convertido = new Array();
for(var j in this) {
this.convertido[j] = true;
}
}
return (elem in this);
}
var arr = new Array(); // declaramos
for(var i=0; i<100000; i++) // rellenamos con números aleatorios
arr[i] = Math.random();
// BÚSQUEDA i
for(var i=0; i<6; i++) {
ini = new Date().getTime(); // inicializamos la medida de tiempo
existe = arr.in_array( Math.random() ); // buscamos un elemento al azar
tiempoTotal = new Date().getTime()-ini;
e("Existe: "+existe+"; he tardado "+tiempoTotal+"ms en buscarlo.");
}
Cita:
Iniciado por output Existe: false; he tardado 5532ms en buscarlo.
Existe: false; he tardado 0ms en buscarlo.
Existe: false; he tardado 0ms en buscarlo.
Existe: false; he tardado 0ms en buscarlo.
Existe: false; he tardado 0ms en buscarlo.
Existe: false; he tardado 0ms en buscarlo.
Tiempo total: 5532ms. La primera búsqueda es notoriamente más larga, pero las siguientes son instantáneas, dando una ventaja al script interesante.
Por si alguna vez a alguien le sirve, ya sabéis que suelo postear más bien cosas experimentales
. Si tenéis que hacer una cosa así, mejor ahorraros la conversión y empezar a crear directamente el array asociativo
Un saludo