Foros del Web » Programando para Internet » Javascript »

Bucle infinito sorteando array

Estas en el tema de Bucle infinito sorteando array en el foro de Javascript en Foros del Web. Hola, tiene tiempo que no me paraba por aqui -mucho trabajo -, pues vengo con una duda que me trae tonto tras horas y horas. ...
  #1 (permalink)  
Antiguo 16/04/2009, 23:27
Avatar de jeybi  
Fecha de Ingreso: julio-2008
Ubicación: Mexico
Mensajes: 130
Antigüedad: 15 años, 9 meses
Puntos: 10
Exclamación Bucle infinito sorteando array

Hola, tiene tiempo que no me paraba por aqui -mucho trabajo -, pues vengo con una duda que me trae tonto tras horas y horas.

Estoy intentando ordenar un array de objetos, cada objejeto tiene una propiedad nombre y otra propiedad modelo, es hay donde me baso para el ordenamiento, primero checo todas las coincidencias posibles para los modelos, si los modelos son muy similares, checo entonces el nombre.

Mi funcion, de forma iterativa lee un array de terminos de busqueda ('termino1', 'termino2'), y por cada termino va sumando puntos, el objeto con mas puntos gana, se posiciona antes en el array.

Todo va perfecto (aun no esta todo muy optimizado claro), pero SOLAMENTE si hay 1 termino, es decir si hay ['dog'], todo ok, si hay ['dog','cat'], bucle infinito...

Haber si le pueden echar una miradita al codigo, es algo largo pero les agradeceria mucho si me pudieran ayudar:

Código javascript:
Ver original
  1. // Ordemos deacuerdo al orden de prioridad
  2.         filas.sort(function(a,b){
  3.             var modeloA = a.modelo.toLowerCase();
  4.             var modeloB = b.modelo.toLowerCase();
  5.             var aPoint = 0;
  6.             var bPoint = 0;
  7.             var matchA;
  8.             var matchB;    
  9.            
  10.                         out:
  11.             for(var i = 0; i < listaTerminos.length; i++){
  12.                 var term = listaTerminos[i];
  13.                 var word = new RegExp(term, "g");
  14.                 var aTest = (machtA = modeloA.match(word)) != null? machtA.length:0;
  15.                 var bTest =  (machtB = modeloB.match(word)) != null? machtB.length:0;
  16.                                
  17.                    
  18.                 if(aTest > bTest){    aPoint += aTest; continue out}    // A tiene mas coincidencias que B
  19.                 else if(aTest < bTest){ bPoint += bTest; continue out}    //B tiene mas coincidencias que A
  20.                 //Checamos por el termino mas cercano
  21.                 else if(aTest > 0){
  22.                     var nummatch = aTest;
  23.                     var modA = modeloA;
  24.                     var modB = modeloB;
  25.                    
  26.                     for(var i =0; i < nummatch; i++ ){
  27.                         aTest = modA.indexOf(term);
  28.                         bTest = modB.indexOf(term);
  29.                        
  30.                         if(aTest < bTest){    aPoint++; continue out}    //la coincidencia aparece primero en A
  31.                         else if(aTest > bTest){ bPoint++; continue out}    //la coincidencia aparece primero en B
  32.                         else{    // procedemos a la siguiente coincidencia
  33.                             modA = (modA.substring(0,aTest))+(modA.substring(aTest+term.length));
  34.                             modB =  (modB.substring(0,bTest))+(modB.substring(bTest+term.length));                            
  35.                         }
  36.                     }                    
  37.                 }
  38.                 // En este punto tenemos las mismas coincidencias en el mismo lugar ó
  39.                 //  hay 0 coincidencias en modelo a y b, procedemos a checar el nombre
  40.                
  41.                 var nombreA = a.nombre.toLowerCase();
  42.                 var nombreB = b.nombre.toLowerCase();                
  43.                 aTest = (machtA = nombreA.match(word)) != null? machtA.length:0;
  44.                 bTest =  (machtB = nombreB.match(word)) != null? machtB.length:0;
  45.                
  46.                 if(aTest > bTest){    aPoint += aTest; continue out}    // A tiene mas coincidencias que B
  47.                 else if(aTest < bTest){ bPoint += bTest; continue out}    //B tiene mas coincidencias que A
  48.                 // Checamos por el termino mas cercano, aTest/bTest son iguales pero no PUEDEN ser 0
  49.                 else {
  50.                     nummatch = aTest;
  51.                     modA = nombreA;
  52.                     modB = nombreB;
  53.                    
  54.                     for(var i =0; i < nummatch; i++ ){
  55.                         aTest = modA.indexOf(term);
  56.                         bTest = modB.indexOf(term);
  57.                        
  58.                         if(aTest < bTest){    aPoint++; continue out}    //la coincidencia aparece primero en A
  59.                         else if(aTest > bTest){ bPoint++; continue out}    //la coincidencia aparece primero en B
  60.                         else{    // procedemos a la siguiente coincidencia
  61.                             modA = (modA.substring(0,aTest))+(modA.substring(aTest+term.length));
  62.                             modB =  (modB.substring(0,bTest))+(modB.substring(bTest+term.length));                            
  63.                         }
  64.                     }                    
  65.                 }
  66.             }
  67.            
  68.             // En este punto, el que tenga mayor cantida de puntos es el que mejor coincidio con los params de busqueda
  69.             if(aPoint > bPoint) return -1;    //A aparecera antes que B
  70.             if(aPoint < bPoint) return 1;    //B aparecera antes que A
  71.            
  72.             //Igualdad total
  73.             return 0;        
  74.            
  75.         });


Saludos y gracias!
  #2 (permalink)  
Antiguo 17/04/2009, 02:27
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bucle infinito sorteando array

No me he mirado todo tu código porque no tiene apenas comentarios y así es un poco chungo de seguir el porqué de lo que haces. Pero una cosa sí que he visto:

No uses el mismo índice para dos bucles anidados. Nunca. En el segundo bucle for, usa j, no i.
  #3 (permalink)  
Antiguo 17/04/2009, 11:29
Avatar de jeybi  
Fecha de Ingreso: julio-2008
Ubicación: Mexico
Mensajes: 130
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: Bucle infinito sorteando array

Vaya, eso resolvio mi problema !, muchas gracias, si el 'i' se me fue, ya que si miras el bucle de abajo es un copy&paste del de arriba, error mio :X

Gracias! ;)
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 16:09.