Sort universe search results with Levenshtein's algorithm (client-side)

This commit is contained in:
Arkezar
2018-07-22 13:21:40 +02:00
parent cdd1b8d099
commit 6297144a1a

View File

@@ -334,6 +334,46 @@ define([
return markup;
}
/**
* sort universe data
* @param data universe search result array
* @param term search term
*/
function sortResultData (data, term){
let levenshtein = function (a,b){
let matrix = new Array(a.length+1);
for(let i = 0; i < matrix.length; i++){
matrix[i] = new Array(b.length+1).fill(0);
}
for(let ai = 1; ai <= a.length; ai++){
matrix[ai][0] = ai;
}
for(let bi = 1; bi <= b.length; bi++){
matrix[0][bi] = bi;
}
for(let bi = 1; bi <= b.length; bi++){
for(let ai = 1; ai <= a.length; ai++){
matrix[ai][bi] = Math.min(
matrix[ai-1][bi]+1,
matrix[ai][bi-1]+1,
matrix[ai-1][bi-1]+(a[ai-1] == b[bi-1] ? 0 : 1)
);
}
}
return matrix[a.length][b.length];
};
data.sort(function(a,b){
let levA = levenshtein(term, a.name.toLowerCase());
let levB = levenshtein(term, b.name.toLowerCase());
return levA === levB ? 0 : (levA > levB ? 1 : -1);
});
}
return this.each(function() {
let selectElement = $(this);
@@ -370,6 +410,7 @@ define([
for(let category in result){
// skip custom functions in case result = [] (array functions)
if(result.hasOwnProperty(category)){
sortResultData(result[category], page.term);
data.results.push({
text: category,
children: result[category].map(mapChildren, category)