Donc, j'ai un hasard javascript tableau de noms...
[@larry,@nicolas,@notch] etc.
Ils commencent tous par le symbole@. Je tiens à les trier par la Distance de Levenshtein, de sorte que les ceux du haut de la liste sont les plus proches du terme de recherche. Pour le moment, j'ai un peu de javascript qui utilise jQuery .grep()
sur l'aide de javascript .match()
méthode autour de l'entrée terme de recherche sur la touche:
(code modifié depuis la première publication)
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();
});
Il a aussi quelques si les déclarations de détecter si le tableau contient des hashtags (#) ou des mentions (@). Ignorez-le. L' imTheCallback
, est le tableau des noms, soit des hashtags ou des mentions, alors modArr
, est le tableau trié. Puis l' .atResults
et .tagResults
- éléments sont des éléments qu'il ajoute à chaque fois dans le tableau, ce qui constitue une liste de noms basé sur les termes de recherche entrés.
J'ai également avoir l'algorithme de Levenshtein:
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);
Comment puis-je travailler avec algorithme (ou un similaire) dans mon code actuel, de sorte sans mauvaise performance?
Mise à JOUR:
Donc, je suis maintenant à l'aide de James Westgate Lev Dist fonction. Œuvres WAYYYY rapide. Si la performance est résolu, le problème est maintenant de l'utiliser avec une source...
modArr = limitArr.sort(function(a, b){
levDist(a, searchy)
levDist(b, searchy)
});
Mon problème est maintenant une compréhension générale sur l'utilisation de l' .sort()
méthode. L'aide est apprécié, merci.
Merci!