Сортировка массива по «расстоянию Левенштейна» с лучшей производительностью в Javascript

Итак, у меня есть случайный массив имен javascript ...

[@ Ларри, @ Николас, @ Нотч] и т. д.

Все они начинаются с символа @. Я хотел бы отсортировать их по расстоянию Левенштейна, чтобы те, которые находятся вверху списка, были ближе всего к поисковому запросу. На данный момент у меня есть некоторые 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 элементы - это элементы, к которым он добавляется каждый раз в массиве, это формирует список имен на основе введенных условий поиска.

яalso есть алгоритм расстояния Левенштейна:

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 Джеймса Вестгейта. Работает WAYYYY быстро. Таким образом, производительность решена, теперь проблема заключается в использовании ее с источником ...

modArr = limitArr.sort(function(a, b){
    levDist(a, searchy)
    levDist(b, searchy)
});

Моя проблема сейчас - общее понимание использования.sort() метод. Помощь приветствуется, спасибо.

Спасибо!

Ответы на вопрос(7)

Ваш ответ на вопрос