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// 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!