Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Al recorrer el array no trae los datos duplicados

Estas en el tema de Al recorrer el array no trae los datos duplicados en el foro de Javascript en Foros del Web. Saludos, Cree este código @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original <html> <head> < script type = "text/javascript" > var n = 0 ; /** ...
  #1 (permalink)  
Antiguo 02/02/2012, 13:54
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Al recorrer el array no trae los datos duplicados

Saludos,

Cree este código
Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. var n = 0;
  5. /**
  6.  * var arr[n++] = new Array('name', 'ip');
  7.  */
  8. var arr = new Array();
  9. arr[n++] = new Array('Vega Baja MXK 1', 'xxx.xxx.xxx.xxx');
  10. arr[n++] = new Array('Vega Baja Sur MXK 1', 'xxx.xxx.xxx.xxx');
  11.  
  12. function search(value){
  13.     if(value == ""){
  14.         document.getElementById('items').innerHTML = '';
  15.         return false;
  16.     }
  17.  
  18.     var nn = 0;
  19.     var found = new Array();
  20.     var str = '';
  21.     var patt = new RegExp(value, "gi");
  22.  
  23.     for(var i = 0; i < arr.length; i++){
  24.         if(patt.test(arr[i][0])){
  25.             found[nn++] = arr[i];
  26.         }
  27.     }
  28.  
  29.     for(var i = 0; i < found.length; i++){
  30.         str += '<a href="http://' + found[i][1] + '">' + found[i][0] + '</a><br />';
  31.     }
  32.  
  33.     document.getElementById('items').innerHTML = str;
  34. }
  35. </script>
  36. </head>
  37. <body>
  38.  
  39. <form action="index.html" onsubmit="return false"><input type="text" name="s" onkeyup="search(this.value);" /></form>
  40.  
  41. <div id="items"></div>
  42.  
  43. </body>
  44. </html>
Si escribo baja no me sale los dos, sin embargo añado esta linea document.getElementById('items').innerHTML += arr[i][0] + ' --- ' + patt.test(arr[i][0]) + '<br />';
Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. var n = 0;
  5. /**
  6.  * var arr[n++] = new Array('name', 'ip');
  7.  */
  8. var arr = new Array();
  9. arr[n++] = new Array('Vega Baja MXK 1', 'xxx.xxx.xxx.xxx');
  10. arr[n++] = new Array('Vega Baja Sur MXK 1', 'xxx.xxx.xxx.xxx');
  11.  
  12. function search(value){
  13.     if(value == ""){
  14.         document.getElementById('items').innerHTML = '';
  15.         return false;
  16.     }
  17.  
  18.     var nn = 0;
  19.     var found = new Array();
  20.     var str = '';
  21.     var patt = new RegExp(value, "gi");
  22.  
  23.     for(var i = 0; i < arr.length; i++){
  24.         if(patt.test(arr[i][0])){
  25.             document.getElementById('items').innerHTML += arr[i][0] + ' --- ' + patt.test(arr[i][0]) + '<br />';
  26.             found[nn++] = arr[i];
  27.         }
  28.     }
  29.  
  30.     for(var i = 0; i < found.length; i++){
  31.         str += '<a href="http://' + found[i][1] + '">' + found[i][0] + '</a><br />';
  32.     }
  33.  
  34.     document.getElementById('items').innerHTML = str;
  35. }
  36. </script>
  37. </head>
  38. <body>
  39.  
  40. <form action="index.html" onsubmit="return false"><input type="text" name="s" onkeyup="search(this.value);" /></form>
  41.  
  42. <div id="items"></div>
  43.  
  44. </body>
  45. </html>
Y aparece las dos opciones. ¿Podrían indicarme que me falta para lograr que salgan los dos datos si escribo baja? Porque colocar esa parte de código, o sea, document.getElementById('items').innerHTML += arr[i][0] + ' --- ' + patt.test(arr[i][0]) + '<br />'; no es algo que se ve bien en un código, a pesar de que muestra lo que necesito.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 08/02/2012 a las 09:01 Razón: quitar ips
  #2 (permalink)  
Antiguo 02/02/2012, 16:14
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Al recorrer el array no trae los datos duplicados

me pasó lo mismo hasta que se me ocurrió quitar el flag global
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #3 (permalink)  
Antiguo 02/02/2012, 16:36
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Al recorrer el array no trae los datos duplicados

¿Te refieres a
Código Javascript:
Ver original
  1. var arr =...

Dejarlo como
Código Javascript:
Ver original
  1. arr =...
?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 02/02/2012, 16:43
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Al recorrer el array no trae los datos duplicados

no, a la expresión regular
Cita:
var patt = new RegExp(value, "i");
prueba, a ver que tal
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 02/02/2012, 18:12
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: Al recorrer el array no trae los datos duplicados

buenas, que tal gente!

un detalle interesante que desconocia. como ha indicado @isabelm, el error sucede porque la expresión regular es global. pero en realidad la situación se da por otro factor adicional. el método test es como exec en cuanto a comportamiento con la diferencia que uno devuelve un boolean y el otro un array. cuando una expresión es global, dichos métodos alteran la propiedad lastIndex el cual es un integer que indica en que posición del string fue la última comprobación que realizó la expresión. la segunda vez que se vuelve a invocar el método, en lugar comenzar desde el inicio del string, parte desde el índice. en todo caso, no tiene sentido realizar una busqueda global con el método test.

para que se entienda la situación... ¿que hubiera pasado si el string del segundo array hubiera sido "Vega Baja Bar & Grill" y la búsqueda es por la B? lo que sucede es que la primera vez que se hace un test de la expresion regular sobre el string "Vega Baja MXK 1", la expresión encuentra la primera "B", y cambia la propiedad lastIndex de la expresión (variable patt) al valor 6. luego, en el segundo string ("Vega Baja Bar & Grill") la búsqueda inicia desde el índice 6. desde ese punto en adelante se encuentra la próxima "B". por tanto, el resultado es que se muestran ambos enlaces.

cuando la expresión no es global, el índice siempre se mantiene en 0, de modo que la búsqueda siempre comienza desde el inicio del string. nótese que ese comportamiento sólo sucede con los métodos test y exec cuando la expresión es global -hasta donde tengo conocimiento.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #6 (permalink)  
Antiguo 02/02/2012, 21:10
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Al recorrer el array no trae los datos duplicados

Cita:
Iniciado por IsaBelM Ver Mensaje
no, a la expresión regular

prueba, a ver que tal
No te creo... Ah mira sí funciona, pues sí te creo

Muy interesante, como la expresión regular funciona en diferentes lenguajes, en PHP preg_match_all es la forma de usar global, pero no tiene ese problema de acordarse sobre en que indice trabajó con el dato anterior.

¡Gracias!

Edito: Ahora me hace sentido el hecho de que al hacer por segunda vez test, mostrara los datos, muy, pero muy bueno lo que haz dicho zero. Todavía no te creo porque no se me ocurrió a mí primero, pero muy bueno,
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 02/02/2012 a las 21:18

Etiquetas: html, input
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 06:34.