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
// Ordemos deacuerdo al orden de prioridad filas.sort(function(a,b){ var modeloA = a.modelo.toLowerCase(); var modeloB = b.modelo.toLowerCase(); var aPoint = 0; var bPoint = 0; var matchA; var matchB; out: for(var i = 0; i < listaTerminos.length; i++){ var term = listaTerminos[i]; var word = new RegExp(term, "g"); var aTest = (machtA = modeloA.match(word)) != null? machtA.length:0; var bTest = (machtB = modeloB.match(word)) != null? machtB.length:0; if(aTest > bTest){ aPoint += aTest; continue out} // A tiene mas coincidencias que B else if(aTest < bTest){ bPoint += bTest; continue out} //B tiene mas coincidencias que A //Checamos por el termino mas cercano else if(aTest > 0){ var nummatch = aTest; var modA = modeloA; var modB = modeloB; for(var i =0; i < nummatch; i++ ){ aTest = modA.indexOf(term); bTest = modB.indexOf(term); if(aTest < bTest){ aPoint++; continue out} //la coincidencia aparece primero en A else if(aTest > bTest){ bPoint++; continue out} //la coincidencia aparece primero en B else{ // procedemos a la siguiente coincidencia modA = (modA.substring(0,aTest))+(modA.substring(aTest+term.length)); modB = (modB.substring(0,bTest))+(modB.substring(bTest+term.length)); } } } // En este punto tenemos las mismas coincidencias en el mismo lugar ó // hay 0 coincidencias en modelo a y b, procedemos a checar el nombre var nombreA = a.nombre.toLowerCase(); var nombreB = b.nombre.toLowerCase(); aTest = (machtA = nombreA.match(word)) != null? machtA.length:0; bTest = (machtB = nombreB.match(word)) != null? machtB.length:0; if(aTest > bTest){ aPoint += aTest; continue out} // A tiene mas coincidencias que B else if(aTest < bTest){ bPoint += bTest; continue out} //B tiene mas coincidencias que A // Checamos por el termino mas cercano, aTest/bTest son iguales pero no PUEDEN ser 0 else { nummatch = aTest; modA = nombreA; modB = nombreB; for(var i =0; i < nummatch; i++ ){ aTest = modA.indexOf(term); bTest = modB.indexOf(term); if(aTest < bTest){ aPoint++; continue out} //la coincidencia aparece primero en A else if(aTest > bTest){ bPoint++; continue out} //la coincidencia aparece primero en B else{ // procedemos a la siguiente coincidencia modA = (modA.substring(0,aTest))+(modA.substring(aTest+term.length)); modB = (modB.substring(0,bTest))+(modB.substring(bTest+term.length)); } } } } // En este punto, el que tenga mayor cantida de puntos es el que mejor coincidio con los params de busqueda if(aPoint > bPoint) return -1; //A aparecera antes que B if(aPoint < bPoint) return 1; //B aparecera antes que A //Igualdad total return 0; });
Saludos y gracias!