Foros del Web » Creando para Internet » Flash y Actionscript »

Filtrar arrays

Estas en el tema de Filtrar arrays en el foro de Flash y Actionscript en Foros del Web. Hola foro!!! ya estoy desesperado Estoy trantando una BD que me han dado echa una pena... y poco a poco voy sacando como puedo lo ...
  #1 (permalink)  
Antiguo 02/03/2006, 10:48
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
Filtrar arrays

Hola foro!!! ya estoy desesperado

Estoy trantando una BD que me han dado echa una pena... y poco a poco voy sacando como puedo lo que me van pidiendo... es una aplicación de búsquedades mediante comboBox anidados... separados en 4 métodos de búsqueda... individualmente al seleccionar uno, muestra una tabla con las coincidencias de ese apartado... llegando a tener 4 listas con nombres (una por cada método)... las listas con los resultados las tengo metidas en 4 arrays... y querría saber cómo hacer para saber qué resultados están repetidos en las listas... teniendo en cuenta que las listas pueden variar de 1 a 4...

por más que le doyvueltas no encuentro la manera de hacerlo... alguien me puede ayudar??

Muchas gracias!!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #2 (permalink)  
Antiguo 02/03/2006, 15:53
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 12 años, 9 meses
Puntos: 0
hola
aquí hice algo que te puede servir de base para elaborar lo que quieres
Código:
var array1:Array = new Array('A','B','C','D','E');
var array2:Array = new Array('A','C','E','T','G');
var array3:Array = new Array('B','E','T','Y','H');
var array4:Array = new Array('H','B','E','G','M');


/*********************************/
//esta función busca dentro de del array 'donde' el elemento 'que'
var filtrar:Function = function(que:String,donde:Array):Boolean{
	//exploramos todos los elementos del array, si su valor es igual al parámetro 'que' entonces RETURN TRUE
	//si luego de recorrer todos los elementos no encontramos coincidencias entonces RETURN FALSE
	for(var elemento in donde) if(donde[elemento]==que) return true; return false;
}
/*ejemplos:
trace(filtrar('B',array1)); //mostrará true
trace(filtrar('B',array2)); //mostrará false
*/


/********************************/
//con esta función buscaremos el parámetro 'texto' dentro de los elementos del array 'en_cuales' (cada elemento de 'en_cuales' es un array)
var filtrar_en_varios:Function = function(texto:String,en_cuales:Array):Boolean{
	//exploramos cada uno de los elemento del array 'en_cuales' que recibimos como parámentros
	for(var elemento in en_cuales){
		//cada elemento es un array, dentro de cada uno buscamos el un elemento 'texto' que recibimos como parámetro
		//esta vez, si no encontramos 'texto' en alguno de ellos, entonces RETURN FALSE (basta que en uno de ellos no este para terminar la funcion con valor RETURN FALSE)
		if(!filtrar(texto,en_cuales[elemento])) return false;
	}
	//si no tenemos problemas quiere decir que si se ha encontrado coincidencias en todos los elementos de 'en_cuales' y devolvemos RETURN TRUE
	return true;
}

/*ejemplos:*/
//buscamos 'B' dentro de array1 y array2
trace(filtrar_en_varios('B',Array(array1,array2))); //devolverá FALSE

//buscamos 'B' dentro de array1 y array4
trace(filtrar_en_varios('B',Array(array1,array4))); //devolverá TRUE

//buscamos 'G' dentro de array1, array2, array3 y array4,
trace(filtrar_en_varios('G',Array(array1,array2,array3,array4))); //devolverá FALSE

//buscamos 'E' dentro de array1, array2, array3 y array4,
trace(filtrar_en_varios('E',Array(array1,array2,array3,array4))); //devolverá TRUE

//*/
también te puede interesar
http://www.forosdelweb.com/showpost....77&postcount=4
__________________
Si digo que soy mentiroso. ¿Lo soy?
  #3 (permalink)  
Antiguo 03/03/2006, 03:53
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
Gracias Luistar!! a ver si me centro en tu script y lo consigo solucionar
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #4 (permalink)  
Antiguo 06/03/2006, 05:30
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
funciona a la perfección!!! pero... no me funciona si una de las matrices está vacía... cómo podría solucionarlo?? o lo debo hacer anidando "ifs"

muchas gracias!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #5 (permalink)  
Antiguo 08/03/2006, 06:44
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
Hola de nuevo Luistar...

He consegido meter en una variable las matrices usadas en la búsqueda... pero no consigo pasarlas correctamente a la función...

mi variable es: arrayUsadas="lesionA,localizacionA"

y en la llamada a la función ha de ir:

if(filtrar_en_varios(nombreEm,Array(lesionA,locali zacionA))){
coinciden.push(nombreEm);
}

Me puedes achar una (otra) mano??

Gracias again!!!!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #6 (permalink)  
Antiguo 08/03/2006, 08:31
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 12 años, 9 meses
Puntos: 0
hola...

al definir la variable arrayUsadas, tienes que hacerlo así:

var arrayUsadas:Array = new Array(lesionA,localizacionA);

//los elementos sin comillas, ya que no son cadenas

y para pasarle como parámetro, así:

if(filtrar_en_varios(nombreEm,arrayUsadas)){
coinciden.push(nombreEm);
}

... mmm :D
__________________
Si digo que soy mentiroso. ¿Lo soy?
  #7 (permalink)  
Antiguo 08/03/2006, 11:26
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
mmmmm, creo que no me he sabido explicar.... lo qu ehago es meter en un array las opciones de búsqueda usadas en cada momento, si no se usa se vacía la posición...

var coincidenA:Array = new Array("","","","")

y entonces me construyo una variable que me dé lo que esté usado según el formato para llamar a la función:

if(coincidenA[0]){ arrayUsadas+=","+coincidenA[0]; }
if(coincidenA[1]){ arrayUsadas+=","+coincidenA[1]; }
if(coincidenA[2]){ arrayUsadas+=","+coincidenA[2]; }
if(coincidenA[3]){ arrayUsadas+=","+coincidenA[3]; }

arrayUsadas=arrayUsadas.slice(1,arrayUsadas.length );

entonces así acabo teniendo las arrays

trace(coincidenA+" = "+arrayUsadas)

lesionA,,colorA, = lesionA,colorA
lesionA,,colorA,localizacionA = lesionA,colorA,localizacionA

entonces... lo que yo querría hacer es en vez de tener que poner un "switch" para todos los casos posible... pues algo así

if(filtrar_en_varios(nombreEm,arrayUsadas)){
coinciden.push(nombreEm);
}

me he explicado mejor??

Muuuuuuchas gracias!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #8 (permalink)  
Antiguo 08/03/2006, 11:29
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
por cierto, acabo de intentar pasar arrayUsadas a un array (arrayBusqueda=arrayUsadas.split(","))mediente un "split"... pero no me funciona tampoco... al poner:

if(filtrar_en_varios(nombreEm,arrayBusqueda)){
coinciden.push(nombreEm);
}


__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #9 (permalink)  
Antiguo 08/03/2006, 12:02
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 12 años, 9 meses
Puntos: 0
hola no entiendo bien lo que quieres hacer

en esta función:

if(filtrar_en_varios(nombreEm,arrayUsadas)){
coinciden.push(nombreEm);
}

nombreEm : debe ser una cadena
arrayUsadas : deber ser un array cuyos elementos son lo arrays donde buscar la cadena

pero según ésta lineas:
if(coincidenA[0]){ arrayUsadas+=","+coincidenA[0]; }
if(coincidenA[1]){ arrayUsadas+=","+coincidenA[1]; }
...

deduzco que arrayUsadas es una cadena y no un array como debería

se pudo haber harmado una cadena de este tipo
var arrayUsadas:String = 'array1,array2,array3';

y luego con eval, evaluariamos la cadena como código
eval('Array('+arrayUsadas+');');

pero eso funciona en php, javascript y probablemente en otros lenguajes
pero no en actionscript

HAbER SI ENTENDI ALGO
lo que intentas es armar el array arrayUsadas con los elementos que cumplan cierta condición
if(coincidenA[0]){ arrayUsadas+=","+coincidenA[0]; } ...
para pasarle como parámetro a la función

si es ello, estás procediendo de manera incorrecta
...

aclara un poco más el detalle xD
__________________
Si digo que soy mentiroso. ¿Lo soy?
  #10 (permalink)  
Antiguo 09/03/2006, 02:27
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
De nuevo gracias Luistar... e efecto intento armar arrayUsadas para que escriba el 2º parámetro que se ha de incluir en la función... y efectivamente... llevo un poco programando en PHP y pensé que se podría hacer lo mismo en AS... has dado en el clavo

La cuestión es que tengo este switch para cada una de las opciones posibles... y las entradas que no funcionan son las "dobles" quitando a "lesionA,morfologiaA,," que sí funciona... pensé que haciéndolo del otro modo evitaría más errores en el código...


Código:
switch(coincidenA.toString(",")){
case "lesionA,morfologiaA,colorA,localizacionA":
if(filtrar_en_varios(nombreEm,Array(lesionA,morfologiaA,colorA,localizacionA))){
coinciden.push(nombreEm);
}
break;
//entradas triples
// con lesionA	
case "lesionA,morfologiaA,colorA,":
if(filtrar_en_varios(nombreEm,Array(lesionA,morfologiaA,colorA))){
coinciden.push(nombreEm);
}
break;
case "lesionA,morfologiaA,,localizacionA":
if(filtrar_en_varios(nombreEm,Array(lesionA,morfologiaA,localizacionA))){
coinciden.push(nombreEm);
}
break;
case "lesionA,,colorA,localizacionA":
if(filtrar_en_varios(nombreEm,Array(lesionA,colorA,localizacionA))){
coinciden.push(nombreEm);
}
break;
// con morfologiaA
case ",morfologiaA,colorA,localizacionA":
if(filtrar_en_varios(nombreEm,Array(morfologiaA,colorA,localizacionA))){
coinciden.push(nombreEm);
}
break;
//entradas dobles
// con lesionA
case "lesionA,morfologiaA,,":			
if(filtrar_en_varios(nombreEm,Array(lesionA,morfologiaA))){
coinciden.push(nombreEm);
}
break;
case "lesionA,,colorA,":
if(filtrar_en_varios(nombreEm,Array(lesionA,colorA))){
coinciden.push(nombreEm);
}
break;
case "lesionA,,,localizacionA":
if(filtrar_en_varios(nombreEm,Array(lesionA,localizacionA))){
coinciden.push(nombreEm);
}
break;
//con morfologiaA
case  ",morfologiaA,colorA,":
if(filtrar_en_varios(nombreEm,Array(morfologiaA,colorA))){
coinciden.push(nombreEm);
}
break;
case ",morfologiaA,,localizacionA":
if(filtrar_en_varios(nombreEm,Array(morfologiaA,localizacionA))){
coinciden.push(nombreEm);
}
break;
//con colorA
case ",,colorA,localizacionA":
if(filtrar_en_varios(nombreEm,Array(colorA,localizacionA))){
coinciden.push(nombreEm);
}
break;
//entradas únicas
case "lesionA,,,": coinciden.push(lesionA[i]); break;
case ",morfologiaA,,": coinciden.push(morfologiaA[i]); break;
case ",,colorA,": coinciden.push(colorA[i]); break;
case ",,,localizacionA":coinciden.push(localizacionA[i]); break;
}
nombreEm viene de un bucle que hago con la matriz que ha encontraod menos coincidencias...

Código:
for (i=0;i<eval(perdedor).length;i++){		
	// todas entradas
	var nombreEm:String=eval(perdedor)[i];
	switch(coincidenA.toString(",")){
		case (script anterior)... :
	}
}
En fin este es el cacao maravillao que tengo de programación...

De nuevo, gracias.
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #11 (permalink)  
Antiguo 09/03/2006, 08:42
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 12 años, 9 meses
Puntos: 0
parece que te estás enredando

según esto: switch(coincidenA.toString(",")){
coincidenA es un array

y lo que haces es convertir sus elementos a cadena para que luego de compararlo se ejecute ejecute una función

...
podrías itentar algo como esto:

Código:
//recibimos como parametro la lista de arrasy a verificar
var alguna_funcion:Function = function(lista_de_arrays:Array):Void{
	
	//creamos un array para almancenar las referencias a los arrays que cumplan alguna condición
	var en_que_arrays_buscar:Array = new Array();
	
	//exploramos la lista que recibimos y verificamos que cumplan alguna condición,
	for(var i in lista_de_arrays){
		//por ejemplo que no estén vacíos
		if(lista_de_arrays[i].length>0){
			//si cuplem entonces añadimos ese array a un array
			en_que_arrays_buscar.push(lista_de_arrays[i]);
		}
	}
	
	//cuando ya tenemos los elementos donde hay que buscar ejecutamos la fución
	if(filtrar_en_varios(nombreEm,en_que_arrays_buscar)){
		coinciden.push(nombreEm);
	}
}
...

aunque aun no entiendo bien sobre lo de: coincidenA.

:D
__________________
Si digo que soy mentiroso. ¿Lo soy?
  #12 (permalink)  
Antiguo 09/03/2006, 09:03
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
Hola luistar... la verdad es que ahora sí que me he perdido... cuándo he de llamar a esa función? y... qué parámetro he de pasarla?? coincidenA??

La verdad es que no me extraña que no me entiendas bien... porque este proyecto ha cambiado tantas veces de sistema que ni yo me entero...

ya no sé cuenta veces te he tenido que agradecer tu ayuda
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #13 (permalink)  
Antiguo 09/03/2006, 09:16
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 12 años, 9 meses
Puntos: 0
es función tienes que llamarla en lugar de la estructura del: switch case y el parametro es precisamente coincidenA (es el que contiene la lista de arrys donde estan las opciones a buscar no?)

osea lo que en conclusión estamos haciendo es filtrar la lista de arrys dónde buscar, antes de buscar en ellos

cosa que se pudo hacer modificando directamente en

var filtrar_en_varios:Function

osea lo que quieres es buscar sólo en algunos arrays, que cumplan alguna condición

entonces te recomiendo que modifiques directamente la función: filtrar_en_varios

el proceso es parecido a la función del mensaje anterior que te di

:D

o publica tus archivos

a ver que se puede hacer

:D
__________________
Si digo que soy mentiroso. ¿Lo soy?
  #14 (permalink)  
Antiguo 10/03/2006, 04:17
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
Hola luistar.... le he añadido un parámetro a la función alguna_funcion pasándole el valor de nombreEm

var alguna_funcion:Function = function(lista_de_arrays:Array,nombreEm:String):Vo id{
}

y la cuestión es que recibe bien el parámetro y construye perfectamente en_que_arrays_buscar pero no rellena coinciden... le pasa lo mismo que cuando yo construía la variable arrayUsadas ...

Gracias igualmente
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
  #15 (permalink)  
Antiguo 10/03/2006, 08:09
Avatar de X3mdesign  
Fecha de Ingreso: octubre-2003
Ubicación: Madrid
Mensajes: 640
Antigüedad: 14 años, 2 meses
Puntos: 2
Hola Luistar!!!! Buenas noticias!!!!!

El problema que no encontrase coincidencias con las entradas dobles mencionadas del switch se debía a que el "perdedor" del bucle:

Código:
for (i=0;i<eval(perdedor).length;i++){		
	// todas entradas
	var nombreEm:String=eval(perdedor)[i];
	switch(coincidenA.toString(",")){
		case (script anterior)... :
	}
}
lo recogía erróneamente ya que comparaba el length de las arrays... y claro si un array no había sido usada su valor era 0 con lo que siempre sería la array perdedora ya que comparaba: lesionA con morfologiaA; colorA con localizacionA... por eso sólo funcionaba cuando lo hacía con lesionA y morfologiaA... vamos un despiste tonto que hacía inservible el switch...

Así que como no consigo que funcione la función alguna_funcion pues creo que se va a quedar con las 1000 líneas del switch...

Así que muchas gracias por todo!!!!!!!!!!!!!! y buen fin de semana!!!!!!
__________________
Nippon-Tour, tu portal sobre Japón
¿Te gusta el manga, haces tus propios dibujos? Visita FanArt de Nippon-Tour
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 05:37.