Foros del Web » Programando para Internet » Javascript »

Funcion similiar a in_array pero en javascript.

Estas en el tema de Funcion similiar a in_array pero en javascript. en el foro de Javascript en Foros del Web. Hola, Necesito comprobar si un valor existe dentro de un array con Javascript..me gustaria saber si existe una funcion parecida a in_array de PHP. Un ...
  #1 (permalink)  
Antiguo 04/01/2008, 14:19
Avatar de AdRiAnCeTe  
Fecha de Ingreso: marzo-2007
Mensajes: 140
Antigüedad: 17 años, 9 meses
Puntos: 0
Funcion similiar a in_array pero en javascript.

Hola,

Necesito comprobar si un valor existe dentro de un array con Javascript..me gustaria saber si existe una funcion parecida a in_array de PHP. Un saludo y gracias!
  #2 (permalink)  
Antiguo 04/01/2008, 14:44
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 7 meses
Puntos: 834
Re: Funcion similiar a in_array pero en javascript.

Probá así:
Código PHP:
<script>
Array.
prototype.in_array=function(){
    for(var 
j in this){
        if(
this[j]==arguments[0]){
            return 
true;
        }
    }
    return 
false;    
}
colores=['azul','índigo','violeta'];
if(
colores.in_array('azul'))alert('pertenece');else alert('no pertenece');
if(
colores.in_array('verde'))alert('pertenece');else alert('no pertenece');

</script> 
  #3 (permalink)  
Antiguo 04/01/2008, 14:46
Avatar de AdRiAnCeTe  
Fecha de Ingreso: marzo-2007
Mensajes: 140
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Funcion similiar a in_array pero en javascript.

Gracias pero al final usé un for y me va de perlas, por si a alguien le sirve:

Código PHP:
function cambiar(ide){
    var 
carga=new Array(1,2,3,4);
    for (
0<= carga.lengthx++) { 
        if(
carga[x]==ide){
            
entroCarga=true;
        }
    }

  #4 (permalink)  
Antiguo 04/01/2008, 20:25
Avatar de 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.
  #5 (permalink)  
Antiguo 06/01/2008, 08:03
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 7 meses
Puntos: 834
Re: Funcion similiar a in_array pero en javascript.

Hola, derkenuke, debe haber un error:
Código PHP:
<script>
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 
casa=['cocina','puerta','ventana','calefón'];
alert(casa.in_array('ventana'));//mal: devuelve false
alert(casa.in_array('alas'));//bien: devuelve false
Array.prototype.in_array_tradicional=function(elem){
    for(var 
j in this){
        if(
this[j]==arguments[0]){
            return 
true;
        }
    }
    return 
false;
    
}  
alert(casa.in_array_tradicional('ventana'));//bien: devuelve true
alert(casa.in_array_tradicional('alas'));//bien: devuelve false
</script> 
  #6 (permalink)  
Antiguo 06/01/2008, 10:09
Avatar de 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.

Sí, lo siento, no sé en qué estaba pensando. No es que hubiera un error, había varios..
Código PHP:
Array.prototype.in_array=function(elem){
    if( !
this.convertido ) {
        
this.convertido = new Array();
        for(var 
j in this)
            
this.convertidothis[j] ] = true;
    }
    return new 
Boolean(elem in this.convertido);

Evidentemente teníamos que devolver elem in this.convertido, no elem in this (¡que para eso creamos el this.convertido!). Por otra parte estaba mal creado, porque la variable j hace referencia a un índice, this[j] como nuevo índice. Cuando estaba mal this.convertido era un array de la misma longitud que this pero con todos sus valores a true (vaya sin sentido).

Bueno, que el valor sea true, 1, o incluso false, undefined da igual, con tal de que tenga un valor definido explícitamente. elem in elArray sólo comprueba si ha sido inicializado, si existe.


Bueno, ahora sí que sí.
Gracias por hacermelo ver Panino!

Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #7 (permalink)  
Antiguo 08/01/2008, 12:01
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Re: Funcion similiar a in_array pero en javascript.

Hola:

Me ha gustado el sistema que propone derkenuke, aunque cada vez que se modificase el array dejaría de ser funcional.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #8 (permalink)  
Antiguo 08/01/2008, 12:48
Avatar de 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 caricatos, gracias.

También podríamos actualizar el this.convertido cada vez que llamemos a in_array(), para ver si se han añadido elementos.

Otra cosa es si eliminamos elementos con splice o esos métodos de array (shift, pop... no me los sé) que también podrían ser redefinidos... pero vamos.


Sólo si cunde.

__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 08/01/2008, 16:12
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Re: Funcion similiar a in_array pero en javascript.

Hola:

Sobre los métodos de los arrays hemos tenido algunas discusiones interesantes en estos foros, y de ellos empecé a hacer esta página: Arrays / Colecciones en javascript. Nuevos métodos..., en ella puse dos de los mensajes de los foros... sobre este tema en concreto yo también probé algo con conversiones... en concreto convertir el array en una cadena y si el indexOf de la cadena a buscar es -1 es por la inexistencia, pero los resultados también fueron desalentadores.
Creo que una buena opción sería aconsejar que el array sea asociativo, pero si no cuela, otra manera de saber la existencia de forma más rápida, creo que podría ser con una búsqueda ordenada, ya que el método sort() es una primitiva, la búsqueda acabaría al obtener el primer elemento igual (existe) o mayor (no existe)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #10 (permalink)  
Antiguo 08/01/2008, 17:15
Avatar de 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 caricatos:

Qué pena que me perdiera ese hilo, seguro que habría podido aportar algo interesante. Está completísima la lista de funciones.

Para búsqueda por conversión a cadena que tú comentas ya se me había pasado por la cabeza muchas veces, y la verdad: Da muchos problemas, nunca he llegado a una versión que valga para todos los casos (si es con números es muy fácil). De hecho he fabricado esta función para el ejemplo (creo que indexOf() es ligeramente más rápida que test()):

Código PHP:
Array.prototype.in_array=function(elem){
    
//return new RegExp("#"+elem+"#","").test( "#"+this.join("#")+"#" );
    
return ("#"+this.join("#")+"#").indexOf("#"+elem+"#") > -1;

Para las búsquedas de antes me ha salido:
Código PHP:
Existefalsehe tardado 2944ms en buscarlo.
Existefalsehe tardado 3145ms en buscarlo.
Existefalsehe tardado 3064ms en buscarlo.
Existefalsehe tardado 3045ms en buscarlo.
Existefalsehe tardado 3034ms en buscarlo.
Existefalsehe tardado 3185ms en buscarlo
Así que funciona, pero sigue siendo un poco lento...



He leido los dos post por encima, no sé si faltan dos funciones que echo de menos: array1.esIgual(array2); que devuelve true si cada elemento del array1 es igual al correspondiente de array2; y array1.copia(); que en algún script he necesitado hacer alguna copia de un array para hacer cambios sin tocar el original, o para entregar a una función un duplicado. No me atrevo a revivir el hilo Lo postearé aquí:

Código PHP:
Array.prototype.esIgual = function(arr2) {
    if( 
this.length === arr2.length ) {
        for(var 
i=0i<arr2.lengthi++)
            if( 
this[i] !== arr2[i] )
                return 
false;
        return 
true;
    }
    else return 
false;
}

Array.
prototype.copia = function() {
    return [].
concat(this);

Las he hecho de cabeza, espero que estén bien.


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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:42.