我有一个随机的 JavaScript 名称数组...
[@larry,@nicholas,@notch] 等等。
它们都以 @ 符号开头。我想按 Levenshtein 距离对它们进行排序,这样列表顶部的名称与搜索词最接近。目前,我有一些 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
中,以此基于输入的搜索词形成一个名称列表。
我还有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);
我该如何将算法(或类似的算法)应用到我的现有代码中,以便在不影响性能的情况下对其进行排序?
更新:
现在我正在使用James Westgate的Lev Dist函数。它的速度非常快。因此性能问题已得到解决,现在的问题是如何将其与源代码一起使用...
modArr = limitArr.sort(function(a, b){
levDist(a, searchy)
levDist(b, searchy)
});
我的问题是关于如何使用.sort()
方法的普遍理解。感谢您的帮助。
谢谢!
for..in
进行迭代?这也会迭代length
属性(或任何其他非索引属性,如果您定义了这样的属性),以及继承的可枚举属性(如果您的其他代码尝试填充 ES5 数组方法,则可能存在)。您可以使用本地的.forEach
或 jQuery 的$.each
来迭代数组。 - Šime Vidasfunction(a,b){ return levDist(a, searchy) - levDist(b,searchy); }
。) - Jordan Gray