Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/04/2009, 23:27
Avatar de jeybi
jeybi
 
Fecha de Ingreso: julio-2008
Ubicación: Mexico
Mensajes: 130
Antigüedad: 16 años, 6 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!