Итак, у меня есть случайный массив имен javascript...
[@larry,@nicholas,@notch] и т. д.
Все они начинаются с символа @. Я хотел бы отсортировать их по расстоянию Левенштейна, чтобы те, что в верхней части списка, были ближе всего к поисковому запросу. На данный момент у меня есть некоторый javascript, который использует jQuery .grep()
с использованием метода javascript .match()
для введенного поискового запроса при нажатии клавиши:
(код отредактирован с момента первой публикации)
limitArr = $.grep(imTheCallback, function(n){
return n.match(searchy.toLowerCase())
});
modArr = limitArr.sort(levenshtein(searchy.toLowerCase(), 50))
if (modArr[0].substr(0, 1) == '@') {
if (atRes.childred('div').length < 6) {
modArr.forEach(function(i){
atRes.append('<div class="oneResult">' + i + '</div>');
});
}
} else if (modArr[0].substr(0, 1) == '#') {
if (tagRes.children('div').length < 6) {
modArr.forEach(function(i){
tagRes.append('<div class="oneResult">' + i + '</div>');
});
}
}
$('.oneResult:first-child').addClass('active');
$('.oneResult').click(function(){
window.location.href = 'http://hashtag.ly/' + $(this).html();
});
Он также имеет некоторые операторы if, определяющие, содержит ли массив хэштеги (#)или упоминает (@ ). Не обращайте внимания. imTheCallback
— это массив имен, либо хэштегов, либо упоминаний, затем modArr
— отсортированный массив. Затем элементы .atResults
и .tagResults
являются элементами, к которым он добавляется каждый раз в массиве, это формирует список имен на основе введенных условий поиска.
У меня также есть алгоритм расстояния Левенштейна:
var levenshtein = function(min, split) {
// Levenshtein Algorithm Revisited - WebReflection
try {
split = !("0")[0]
} catch(i) {
split = true
};
return function(a, b) {
if (a == b)
return 0;
if (!a.length || !b.length)
return b.length || a.length;
if (split) {
a = a.split("");
b = b.split("")
};
var len1 = a.length + 1,
len2 = b.length + 1,
I = 0,
i = 0,
d = [[0]],
c, j, J;
while (++i < len2)
d[0][i] = i;
i = 0;
while (++i < len1) {
J = j = 0;
c = a[I];
d[i] = [i];
while(++j < len2) {
d[i][j] = min(d[I][j] + 1, d[i][J] + 1, d[I][J] + (c != b[J]));
++J;
};
++I;
};
return d[len1 - 1][len2 - 1];
}
}(Math.min, false);
Как я могу использовать алгоритм (или аналогичный )в моем текущем коде, чтобы отсортировать его без плохой производительности?
ОБНОВЛЕНИЕ:
Так что теперь я использую функцию Lev Dist Джеймса Вестгейта. Работает ОЧЕНЬ быстро. Таким образом, производительность решена, теперь проблема заключается в использовании его с исходным кодом...
modArr = limitArr.sort(function(a, b){
levDist(a, searchy)
levDist(b, searchy)
});
Теперь моя проблема заключается в общем понимании использования метода .sort()
. Помощь приветствуется, спасибо.
Спасибо!