Foros del Web » Programando para Internet » Javascript »

Realizar búsquedas dentro de un Array

Estas en el tema de Realizar búsquedas dentro de un Array en el foro de Javascript en Foros del Web. Hola a todos Tengo un formulario con dos Arrays en unos van los usuarios y en otro la edad, correspondiente de cada uno. He hecho ...
  #1 (permalink)  
Antiguo 18/06/2013, 03:57
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Realizar búsquedas dentro de un Array

Hola a todos
Tengo un formulario con dos Arrays en unos van los usuarios y en otro la edad, correspondiente de cada uno.
He hecho un formulario de búsqueda donde al introducir un nombre si lo encuentra me lo muestra en un input y si no, sale un mensaje, hasta ahí bien, pero necesito varias cosas que no he conseguido todavía:
Que en la búsqueda no tenga en cuenta mayúsculas y minúsculas, tal como está tengo que introducir el nombre tal cual está declarado.
Y necesito que cuando encuentre el nombre buscado, la búsqueda es exclusivamente por este campo, que me muestre también en otro input la edad correspondiente a ese nombre.
Y por último si en el resultado encuentra más de un elemento, como me lo muestra en un input necesito que me muestre sólo el primero y el resto me lo vaya mostrando a través de un botón que al pulsarle me vaya mostrando los siguientes resultados de uno en uno hasta llegar al último.

<script language="javascript" type="text/javascript">
var edad = new Array();
edad[0] = 35;
edad[1] = 42;
edad[2] = 51;
edad[3] = 28;
edad[4] = 26;

var nombre = new Array();
nombre[0] = "Antonio";
nombre[1] = "Luis";
nombre[2] = "María";
nombre[3] = "Pedro";
nombre[4] = "Mario";
function busqueda() {
var b = document.getElementById("buscar").value;
var usuarios = "";
if(b!="") {
for(var i=0; i<nombre.length; i++) {
if(nombre[i].indexOf(b)!=-1) {
usuarios += nombre[i];

}
}
if(usuarios != ""){
document.getElementById('nombre').value = usuarios;
document.getElementById('edad').value = edad[1];
} else {
document.getElementById('mensaje').innerHTML="\<p\ >No se han encontrado resultados\<\/p\>"
}
}
}
</script>


Código HTML

Innput donde se introduce el texto de busqueda:
<input type="text" id="buscar" size="30" maxlength="25" value="ingresar texto de búsqueda" onFocus='this.value="";' />

Botón para comenzar la búsqueda:
<button type="button" value="Buscar" onclick="busqueda()"><strong>Buscar por Nombre</strong></button>

Input de resultados para el campo nombre y el campo edad:
Nombre: <input type="text" id="nombre" size="30" maxlength="25" value="" />
Edad: <input type="text" id="edad" size="30" maxlength="25" value="" />

Botón para mostrar los siguientes resultados
<input type="button" value="Siguiente" onmousedown="aqui iria la funcion">

<br />
Posición donde sale el mensaje en caso de que no encuentre datos
<div id="mensaje"></div>
  #2 (permalink)  
Antiguo 18/06/2013, 06:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Realizar búsquedas dentro de un Array

De entrada usa un array multidimensional para guardar los datos así te vas a ahorrar una busqueda

Código Javascript:
Ver original
  1. var personas = new Array();
  2. personas[0][0] = "Antonio";
  3. personas[0][1] = 35;
  4. personas[1][0] = "Luis";
  5. personas[1][1] = 42;
  6. personas[2][0] = "María";
  7. personas[2][1]= 51;
  8. personas[3][0] = "Pedro";
  9. personas[3][1] = 28;
  10. personas[4][0] = "Mario";
  11. personas[4][1] = 26;

Crea un array para guardar los resultados de la busqueda

Código Javascript:
Ver original
  1. var usuarios = new Array();

Crea una variable para guardar el ultimo mostrado.

Código Javascript:
Ver original
  1. var ultimomostrado=0;

deben ser fuera de la funcion ya que las vas a necesitar en la función que debe mostrar los sucesivos resultados si hay mas de uno.

Para evitar el problema de las mayúsculas y la minúsculas usa .toLowerCase() y compara simpre minúsculas contra minúsculas

Código Javascript:
Ver original
  1. personas[i][0].toLowerCase()==b.toLowerCase()

Cuando encuentres a uno de los usuarios guarda el nombre y la edad

Código Javascript:
Ver original
  1. var usuario=new Array();
  2. usuario[0]=personas[i][0];
  3. usuario[1]=personas[i][1];
  4. usuarios[]=usuario;

Haz un condicional triple que vea cuantos usuarios has encontrado

Código Javascript:
Ver original
  1. if(usuarios.length==1){
  2.    document.getElementById('nombre').value = usuarios[0][0];
  3.    document.getElementById('edad').value = usuarios[0][1];
  4.    document.getElementById("botsiguiente").disabled=true;
  5. } else if (usuarios.length>1) {
  6.    document.getElementById('nombre').value = usuarios[0][0];
  7.    document.getElementById('edad').value = usuarios[0][1];
  8.    document.getElementById("botsiguiente").disabled=false;
  9. }else{
  10.    document.getElementById('mensaje').innerHTML="\<p\ >No se han encontrado resultados\<\/p\>";
  11.    document.getElementById('nombre').value = "";
  12.    document.getElementById('edad').value = "";
  13.    document.getElementById("botsiguiente").disabled=true;
  14. }

Define bien el boton.

Cita:
Botón para mostrar los siguientes resultados
<input type="button" value="Siguiente" onmousedown="aqui iria la funcion">
mejor

Código HTML:
Ver original
  1. <input name="botsiguiente" type="button" disabled="true" id="botsiguiente" onClick="siguiente()"  value="Siguiente">

La funcion siguiente() cae por su peso

Código Javascript:
Ver original
  1. function siguiente(){
  2.  if (ultimomostrado<usuarios.length){
  3.      ultimomostrado++;
  4.      document.getElementById('nombre').value = usuarios[ultimomostrado][0];
  5.      document.getElementById('edad').value = usuarios[ultimomostrado][1];
  6.      if(ultimomostrado==usuarios.length){
  7.         document.getElementById("botsiguiente").disabled=true;
  8.      }else{
  9.         document.getElementById("botsiguiente").disabled=false;
  10.      }
  11.    }
  12. }
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 18/06/2013 a las 06:43
  #3 (permalink)  
Antiguo 18/06/2013, 13:15
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Información Respuesta: Realizar búsquedas dentro de un Array

El Array de personas al cargar la pagina me dice errores en la página, sin hacer nada, sólo al meter ese Array

Y en el siguiente array en el elemento usuarios falta completar los corchetes

var usuario=new Array();
usuario[0]=personas[i][0];
usuario[1]=personas[i][1];
usuarios[]=usuario;
  #4 (permalink)  
Antiguo 18/06/2013, 14:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Realizar búsquedas dentro de un Array

Perdona me pase de listo y creo que mezcle sintaxis de varios lenguajes ... ahi lo tienes corregido.

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Documento sin título</title>
  5. <script language="JavaScript" type="text/javascript">
  6. var usuarios=new Array();
  7. var personas = new Array();
  8. var persona=new Array();
  9. persona[0] = "Antonio";
  10. persona[1] = 35;
  11. personas.push(persona);
  12. persona=new Array();
  13. persona[0] = "Luis";
  14. persona[1] = 42;
  15. personas.push(persona);
  16. persona=new Array();
  17. persona[0] = "María";
  18. persona[1]= 51;
  19. personas.push(persona);
  20. persona=new Array();
  21. persona[0] = "Pedro";
  22. persona[1] = 28;
  23. personas.push(persona);
  24. persona=new Array();
  25. persona[0] = "Mario";
  26. persona[1] = 26;
  27. personas.push(persona);
  28. </head>
  29. <b>Personas</b><br />
  30. <span id="personas"></span><br />
  31. <b>Usuarios</b><br />
  32. <span id="usuarios"></span>
  33. <script language="JavaScript" type="text/javascript">
  34. for (var i=0;i<personas.length;i++){
  35.     document.getElementById("personas").innerHTML+=personas[i][0]+" "+personas[i][1]+"<br>";
  36.     var usuario=new Array();
  37.     usuario[0]=personas[i][0];
  38.     usuario[1]=personas[i][1];
  39.     usuarios.push(usuario);
  40.     }
  41. for (var i=0;i<usuarios.length;i++){
  42.     document.getElementById("usuarios").innerHTML+=usuarios[i][0]+" "+usuarios[i][1]+"<br>";
  43.     }
  44. </body>
  45. </html>
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 19/06/2013, 12:03
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Información Respuesta: Realizar búsquedas dentro de un Array

Por qué le has puesto los push, si ese método es para añadir elementos y yo simplemente lo que quiero es realizar una búsqueda sobre un array y que cuando me encuentre más de un elemento sólo me muestre por pantalla uno, y los demás me los vaya mostrando también de uno en uno, cada vez que pulse el botón de siguiente.
La búsqueda ya funciona y perfectamente, pero el problema es ese, que me muestra todos los encontrados de golpe, todos al mismo tiempo y los quiero de uno en uno.

Te vuelvo a pasar el código como lo tengo ahora para que le eches un vistazo, yo creo que sólo necesita algún arreglillo

<script language="javascript" type="text/javascript">
// Carga de contactos
var ultimomostrado = 0;
var buscarNombre = new Array();
buscarNombre[0] = "Daniel";
buscarNombre[1] = "Luis";
buscarNombre[2] = "María";
buscarNombre[3] = "David";
buscarNombre[4] = "Mario";
var edad = new Array();
edad[0] = 35;
edad[1] = 42;
edad[2] = 51;
edad[3] = 28;
edad[4] = 26;
// y un monton mas de Arrays y de elementos en cada Array
function busca() {
var s = document.getElementById("buscar").value;
var nombres = "";
var edades = "";

if(s!="") {
for(var i=0; i<searchNombre.length; i++) {
if(buscarNombre[i].indexOf(s)!=-1) {
nombres += buscarNombre[i]+"<br/>";
edades += edad[i]+"<br/>";
}
}

if (nombres.length>1) {
document.getElementById('mensaje').innerHTML=nombr es;
document.getElementById('edad').innerHTML=edades;
document.getElementById("botsiguiente").disabled=f alse;
}else{
document.getElementById('mensaje').innerHTML="\<p\ >No se han encontrado resultados\<\/p\>";
document.getElementById('edad').value = "";
document.getElementById('mensaje').value = "";
document.getElementById("botsiguiente").disabled=t rue;
}
}
}

Aquí queda arreglar la variable que tal como está no tiene mucha eficacia

function siguiente(){
if (ultimomostrado<nombres.length){
ultimomostrado++;
document.getElementById('nombre').value = nombres[ultimomostrado][0];
document.getElementById('edad').value = nombres[ultimomostrado][1];
if(ultimomostrado==nombres.length){
document.getElementById("botsiguiente").disabled=t rue;
}else{
document.getElementById("botsiguiente").disabled=f alse;
}
}
}
</script>
  #6 (permalink)  
Antiguo 20/06/2013, 07:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Realizar búsquedas dentro de un Array

Mas de un arreglillo

Código HTML:
Ver original
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <title>Documento sin t&iacute;tulo</title>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  4. <script language="javascript" type="text/javascript">
  5. // Carga de contactos
  6. var ultimomostrado = 0;
  7. var encontrados=new Array();
  8. var buscarNombre = new Array();
  9. buscarNombre = [["Daniel",35],
  10.                 ["Luis",42],
  11.                 ["María",19],
  12.                 ["María",51],
  13.                 ["David",28],
  14.                 ["Mario",26]];
  15. function busca(buscar) {
  16.     encontrados=new Array();
  17.     for(var i=0; i<buscarNombre.length; i++) {
  18.         if(buscarNombre[i][0].toLowerCase()==buscar.toLowerCase()) {
  19.             encontrados.push(buscarNombre[i]);
  20.         }
  21.     }
  22.  
  23.     if (encontrados.length==1) {
  24.         document.getElementById('mensaje').innerHTML="1/1 resultados";
  25.         document.getElementById('nombre').innerHTML=encontrados[0][0];
  26.         document.getElementById('edad').innerHTML=encontrados[0][1];
  27.         document.getElementById("botsiguiente").disabled=true;
  28.     }else if(encontrados.length>1){
  29.         document.getElementById('mensaje').innerHTML="1 de "+encontrados.length+" resultados";
  30.         document.getElementById('nombre').innerHTML=encontrados[0][0];
  31.         document.getElementById('edad').innerHTML=encontrados[0][1];
  32.         document.getElementById("botsiguiente").disabled=false;
  33.     }else{
  34.         document.getElementById('mensaje').innerHTML="No se han encontrado resultados";
  35.         document.getElementById('nombre').innerHTML="";
  36.         document.getElementById('edad').innerHTML = "";
  37.         document.getElementById("botsiguiente").disabled=true;
  38.     }
  39.   }
  40.  
  41. function siguiente(){
  42.     if (ultimomostrado<encontrados.length){
  43.         ultimomostrado++;
  44.         var num=ultimomostrado+1;
  45.         document.getElementById('mensaje').innerHTML=num+" de "+encontrados.length+" resultados";
  46.         document.getElementById('nombre').innerHTML= encontrados[ultimomostrado][0];
  47.         document.getElementById('edad').innerHTML = encontrados[ultimomostrado][1];
  48.         if(ultimomostrado==encontrados.length-1){
  49.             document.getElementById("botsiguiente").disabled=true;
  50.         }else{
  51.             document.getElementById("botsiguiente").disabled=false;
  52.         }
  53.     }
  54. }
  55. </head>
  56.  
  57. Nombres<br>
  58. <span id="lNombres"></span><br>
  59. <script language="JavaScript" type="text/javascript">
  60. for (var i=0;i<buscarNombre.length;i++){
  61.    document.getElementById("lNombres").innerHTML+=buscarNombre[i][0]+" "+buscarNombre[i][1]+"<br>";
  62.     }
  63. Ingresar texto de búsqueda&nbsp;<input type="text" id="buscar" size="30" maxlength="25" value="" onBlur="busca(this.value)" /><br>
  64. <span id="nombre"></span>&nbsp;<span id="edad"></span><br>
  65. <span id="mensaje"></span><br><input name="botsiguiente" type="button" disabled="true" id="botsiguiente" onClick="siguiente()"  value="Siguiente">
  66. </body>
  67. </html>
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #7 (permalink)  
Antiguo 21/06/2013, 02:58
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Información Respuesta: Realizar búsquedas dentro de un Array

He dicho lo de arreglillo porque soy muy modesto, pero es verdad que al ver el código que me has mandado el mío necesitaba una restauración completa.

Pero ahora si que necesita un par de ajustes:
Antes podías escribir el nº de caracteres que quisieras y te buscaba los elementos, si escribias las dos primeras letras, te mostraba todas las palabras que empezaban por esas letras, ahora para obtener resultados tienes que escribir la palabra completa, si te falta una sola letra ya no la encuentra.
Al código que me has mandado le he incluido un botón para que haga la búsqueda al pulsar este, pero me hace la búsqueda al pulsar en cualquier sitio del documento, y no sólo al pulsar el botón.
Si le quito al input text el evento onChange="busca(this.value)" y pulso en el botón entonces no hace nada, no hace la búsqueda.
Como habrás visto en el código del input, le he incluido dos funciones para que me saque un texto cuando el campo está vacío y funciona.
Y lo que necesito también es que al cargar la página o recargar me borre el contenido de todos los input text del formulario pero no lo he conseguido y he probado de todas las formas
document.formBusqueda.reset();

<body onLoad="limpiarform">

Nombre de usuario: <input name=text1 type="text" id="buscar" size="30" maxlength="25" value="Ingresar texto de búsqueda" onFocus="limpiar_texto()" onBlur="mostrar_texto()" onChange="busca(this.value)" />
<button type="button" id="buscar" value="Buscar" onMouseDown="busca(this.value)" ><strong>Buscar por Título</strong></button>
<input type="reset" value="Borrar datos" onmousedown="this.form.reset();">
  #8 (permalink)  
Antiguo 21/06/2013, 05:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Realizar búsquedas dentro de un Array

Código HTML:
Ver original
  1. <body onLoad="limpiarform">
  2. ....
  3.   <form>
  4.       Nombre de usuario:
  5.          <input name=text1 type="text" id="buscar" size="30" maxlength="25" value="Ingresar texto de búsqueda" onFocus="limpiar_texto()"  />
  6.          <button type="button" id="botbuscar" value="Buscar" onClick="busca(document.getElementById('buscar').value)" >
  7.             <strong>Buscar por Título</strong>
  8.          </button>
  9.          <input type="reset" value="Borrar datos">
  10.    </from>

Ojo que los id deben ser únicos.
Si el boton es de type reset no necesita nada para que limpie el formulario.

this.value significa "el valor de este objeto" luego si usas la función en el boton no puedes poner this puesto que el valor esta en otro objeto.... de ahí document.getElementById('buscar').value.


Para que busque con solo alguna de las letras deberias cambiar la comparación....usar la que habias puesto pero pasando primero a minúsculas....

Cambiar

Código Javascript:
Ver original
  1. if(buscarNombre[i][0].toLowerCase()==buscar.toLowerCase()) {

por
Código Javascript:
Ver original
  1. var nodoLower=buscarNombre[i][0].toLowerCase();
  2.  if(nodoLower.indexOf(buscar.toLowerCase())!=-1) {
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 21/06/2013 a las 05:14
  #9 (permalink)  
Antiguo 21/06/2013, 13:31
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Información Respuesta: Realizar búsquedas dentro de un Array

Problemillas anteriores resueltos.

Pero....., siempre hay un pero

Cuando haces una búsqueda y te aparecen varios resultados y borras el contenido del input text con el input type="reset" y vuelves a hacer una búsqueda, también con varios resultados, te pone 1/2 por ejemplo, hasta ahí bien, pues pinchas el botón de siguiente y ya te pone 3/2 y no cambia el nombre al segundo encontrado, sino que se mantiene en el primero y sale un mensaje de errores en la página.
Esto sólo ocurre cuando utilizo el botón de reset, si cuando voy a hacer una nueva búsqueda refresco o actualizo la página esto no pasa, funciona perfectemente.
  #10 (permalink)  
Antiguo 25/06/2013, 00:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Realizar búsquedas dentro de un Array

Haz una funcion que limpie el contenido del array de resultados y asociala al onclick de boton de resset.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 25/06/2013 a las 04:35
  #11 (permalink)  
Antiguo 25/06/2013, 03:04
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Información Respuesta: Realizar búsquedas dentro de un Array

Ya está solucionado, funciona perfectamente, lo que he hecho es más sencillo que eso.
Dentro de la función del botón siguiente en el if que habilita el botón en función de los resultados encontrados, le reinicio la variable ultimomostrado

if(ultimomostrado==encontrados.length-1){
document.getElementById("botsiguiente").disabled=t rue;
ultimomostrado = 0;
}else{
document.getElementById("botsiguiente").disabled=f alse;
}
  #12 (permalink)  
Antiguo 26/06/2013, 13:34
 
Fecha de Ingreso: mayo-2013
Mensajes: 38
Antigüedad: 11 años
Puntos: 0
Información Respuesta: Realizar búsquedas dentro de un Array

última consulta y ya no te molesto más

Como hago para poder introducir nombres en el input text sin los acentos y que me los encuentre cuando en el Array están con acentos.

O sea yo escribo maria sin acento y en vez de decirme que no se encuentran resultados me debe aparecer María.

Y otra cosilla esto es simplemente para que me eches un vistazo al código, incluido el return, yo creo que está bien.

He incluido en el input text unas líneas de validación para que salga un mensaje en el caso de que los caracteres no sean correctos o el campo esté en blanco y si todo es correcto pues que haga la búsqueda.

function busca(buscar) {
campoNombre = document.getElementById("text1").value;

//valida que el texto del campo no sea el que aparece automáticamente al tener el foco
if (campoNombre == "Ingresar texto de búsqueda"){
alert(" ¡Por favor! \n escriba el texto de búsqueda");
return false;
//valida que el campo no esté vacío y no tenga sólo espacios en blanco
}else if(campoNombre == 0){
alert("El campo no puede estar en blanco");
return false;
}else
encontrados=new Array();
for(var i=0; i<buscarNombre.length; i++) {
var nodoLower=buscarNombre[i][0].toLowerCase();
if(nodoLower.indexOf(buscar.toLowerCase())!=-1) {
encontrados.push(buscarNombre[i]);
}
}

Etiquetas: formulario, funcion, 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




La zona horaria es GMT -6. Ahora son las 09:07.