Comunidad de diseño web y desarrollo en internet online

Buscar en un array según elemento seleccionado

Citar            
MensajeEscrito el 12 Jul 2018 05:42 pm
Hola a tod@s haber si me podéis ayudar
Tengo un array de 2 dimensiones y quiero que me busque en dicho array el texto introducido en el input de un formulario, pero según el input en el que se haya introducido el texto me lo tiene que buscar en un índice o en otro y si ha escrito en los dos input, en este caso lo tiene que buscar en los dos índices y mostrar los resultados que cumplan las dos condiciones
Este es el formulario resumido, sólo he puesto 2 input

Código HTML :

<form name='formu1' id='formu1'>
<label>Nombre: </label><input type="text" name="nombre" id="nombre">
<label>Apellido: </label><input type="text" name="apellido" id="apellido"><br /><br />
 </form>
<input type="button" onclick="busqueda();" name="procesar" value="procesar">

Código Javascript :

var datos = new Array();
datos =[["Jose","Naranjo"],
["Jose","Perez"],
["Antonio","Garcia"],
["Antonio","Moreno"]];

function elementosForm() {
var mostrarName = "";

var los_elementos = document.getElementById('formu1').elements;
for (i=0; i<los_elementos.length; i++) {
    if(los_elementos[i].value == ''){
      mostrarName += '';  
        }else{
         mostrarName += los_elementos[i].name + '&&';                 
        }
}
return mostrarName
}

Con esta función lo que hago es recorrer el formulario y que me muestre los name de los input que tengan texto

Código Javascript :

function busqueda(){

   var txtNombre = document.getElementById("nombre").value;   
   var txtApellido = document.getElementById("apellido").value;

   var n = datos.length;   
    buscarNombre = [];
   
   for (var i = 0; i < n; i++)   
    {
   var nombre = datos[i][0].toLowerCase().indexOf(txtNombre)>=0;   
   var apellido = datos[i][1].toLowerCase().indexOf(txtApellido)>=0;   

var datosBusqueda = elementosForm();
//var datosBusqueda = nombre && apellido            
if (datosBusqueda){
      buscarNombre.push(datos[i]);            
      }      
   }
   alert(buscarNombre)
}

Y con esta función hago la búsqueda según el name o los names que reciba de la otra función, por ejemplo si recibo el name nombre, var datosBusqueda debería ser igual a la variable nombre, y realizar la búsqueda en datos[i][0] si recibo apellido, pues igual a la variable apellido y hacer la búsqueda en datos[i][1], y si recibo los names, nombre && apellido, var datosBusqueda debería ser igual a las variables nombre && apellido, para que me busque en datos[i][0] && datos[i][1] pero esto no se como hacerlo

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 13 Jul 2018 10:58 am
Si usas objetos en vez de array dentro de array, algo asi

datos =[{nombre:"Jose",apellido:"Naranjo"},{nombre:"Pedro",apellido:"Flores"}, ... ];

Luego buscas asi

Código :

function buscar(criterio, valor){ //criterio puede ser nombre o apellido
  for (var i = 0; i < datos.length; i++) {
    if(datos[i][criterio]==valor) return datos[i]
  }
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 13 Jul 2018 08:17 pm
Ante todo darte las gracias por contestar, me gustaría resolver el problema con arrays, porque el programa lo tengo ya así y para terminarlo me falta sólo resolver ese pequeño problema y tendría que modificar una serie de funciones y además soy novato en JavaScript, pero en arrays pero tengo algo más de práctica y el tema de objetos pues lo he visto sólo de pasada.
Pero entrando en el tema de los objetos, el criterio puede ser uno o varios, me explico, si yo los datos los recibo por el input nombre, tiene que buscar en el índice[0] si es por apellido en el índice[1] pero si tienen texto los dos, el criterio sería [0] && [1] y el ejemplo que he puesto son dos input pero pueden ser más o incluir en la búsqueda y por tanto en los criterios un checkbox o varios y el criterio lo tiene que marcar el recorrido por el formulario, que es lo que me indica que input o checkbox tienen texto o están marcados y con objetos sigo sin saber como hacerlo, me pasa lo mismo que con arrays

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 16 Jul 2018 01:16 pm
La idea de usar objetos es hacer un lookup como un diccionario, mientras que el uso de array te obliga a recorrerlos todo en busca de coincidencias. Si los criterios son muchos, entonces tienes que recorrer el array muchas veces, mientras que en un objeto acumulas condiciones. Debajo reformulo la funcion para tres condiciones (la captura de los correspondientes checkbox y valores no lo pongo porque es trivial.
Para hacer lo mismo con arrays, deberias recorrerlo 3 veces buscando 3 matches, con lo cual tienes que traerte los resultados parciales de cada recorrido.

En sintesis: la eleccion errónea de la estructura de datos puede complejizar y hasta llevar al fracaso (los algoritmos empiezan a complejizarse innecesariamente) cualquier aplicacion. Yo me tomaria el tiempo de pensar en objetos o hacer la busqueda en el backend, cargar todos los datos y buscarlos desde el lado cliente tambien es una arquitectura no deseable, a menos que no haya opcion.

Debajo como quedaria una busqueda multiple con hasta 3 criterios. Puedes pasar null para los criterios y valores 2 y 3, le doy un default a true para que no interfiera en la evaluacion si hubiera un solo criterio.

Código :

function buscar(criterio1, valor1, criterio2, valor2, criterio3, valor3){ 
criterio1 = datos[i][criterio1]==valor1;
criterio2 = (criterio2)?datos[i][criterio2]==valor2:true;
criterio3 = (criterio3)?datos[i][criterio3]==valor3:true;
 if(criterio1 && criterio2 && criterio3) return datos[i]
  else return false;
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 20 Jul 2018 12:01 pm
Mi idea inicial, que al principio lo veía fácil era recorrer el formulario y a través de la variable

Código Javascript :

mostrarName += los_elementos[i].name + '&&';

Me mostrara los elementos que estaban activos y una vez que conozco dichos elementos lo que único que necesito es una función que me vaya añadiendo con el operador && las variables que hacen las búsquedas en los distintos campos.
Si están activos nombre && apellidos que eso me lo da la variable mostraName, necesito una función que en la función búsquedas me haga lo mismo, me cree una variable que contenga a su vez las variables nombre && apellidos correspondientes al array datos, pero si esto no se puede hacer, pues tendré que hacerlo con objetos, que como ya he dicho no lo domino mucho, pero en este caso también necesitaré recorrer el formulario y saber que elementos están activos y utilizar estos datos en los criterios, porque no es algo fijo, se puede hacer la búsqueda sólo por nombre, solo por apellido, por las dos y podemos añadir más, el formulario que he puesto es sólo un ejemplo, podemos añadir la ciudad y más datos, etc. y sin obligar a que estén rellenados determinados campos, para que puedan hacer la búsqueda combinando todos los campos que tiene disponibles de la manera que quieran, esa es mi idea

Por pedromir

29 de clabLevel



 

mozilla
Citar            
MensajeEscrito el 20 Jul 2018 02:02 pm
Usar lookups de objetos es una practica comun, ya que los diccionarios tienen mucha mejor performance que los arrays multidimensionales. Tampoco es mi idea, es un concepto basico de estructura de datos. Te iras haciendo con el a medida que tus proyectos se complejicen

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.