Ver Mensaje Individual
  #4 (permalink)  
Antiguo 04/01/2008, 20:25
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: Funcion similiar a in_array pero en javascript.

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=0i<100000i++)                        // rellenamos con números aleatorios
    
arr[i] = Math.random();


// BÚSQUEDA i
for(var i=0i<6i++) {
    
ini = new Date().getTime();                    // inicializamos la medida de tiempo
    
existe arr.in_arrayMath.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=0i<100000i++)                        // rellenamos con números aleatorios
    
arr[i] = Math.random();

// BÚSQUEDA i
for(var i=0i<6i++) {
    
ini = new Date().getTime();                    // inicializamos la medida de tiempo
    
existe arr.in_arrayMath.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
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.