所以我有一个随机的javascript名称数组…
[@ larry,@ nicholas,@ notch]等
它们都以@符号开头。我想按Levenshtein距离对它们进行排序,以使列表顶部的那些最接近搜索词。目前,我有一些使用jQuery的javascript,.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函数。快速运行WAYYYY。因此性能得以解决,现在的问题是将其与源一起使用…
modArr = limitArr.sort(function(a, b){
levDist(a, searchy)
levDist(b, searchy)
});
我现在的问题是对使用该.sort()
方法的一般理解。感谢您的帮助,谢谢。
谢谢!
几年前,我编写了一个内联拼写检查器,并实现了一个Levenshtein算法-因为它是内联的,对于IE8,我做了很多性能优化。
var levDist = function(s, t) {
var d = []; //2d matrix
// Step 1
var n = s.length;
var m = t.length;
if (n == 0) return m;
if (m == 0) return n;
//Create an array of arrays in javascript (a descending loop is quicker)
for (var i = n; i >= 0; i--) d[i] = [];
// Step 2
for (var i = n; i >= 0; i--) d[i][0] = i;
for (var j = m; j >= 0; j--) d[0][j] = j;
// Step 3
for (var i = 1; i <= n; i++) {
var s_i = s.charAt(i - 1);
// Step 4
for (var j = 1; j <= m; j++) {
//Check the jagged ld total so far
if (i == j && d[i][j] > 4) return n;
var t_j = t.charAt(j - 1);
var cost = (s_i == t_j) ? 0 : 1; // Step 5
//Calculate the minimum
var mi = d[i - 1][j] + 1;
var b = d[i][j - 1] + 1;
var c = d[i - 1][j - 1] + cost;
if (b < mi) mi = b;
if (c < mi) mi = c;
d[i][j] = mi; // Step 6
//Damerau transposition
if (i > 1 && j > 1 && s_i == t.charAt(j - 2) && s.charAt(i - 2) == t_j) {
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
}
}
}
// Step 7
return d[n][m];
}
问题内容: 无法弄清楚如何对用户附近的 地址 进行自动 排序 。我不明白从哪里开始以及如何编写代码。 我的 firebase中 有地址。地址的类型为字符串(不是纬度/经度)。例: 我知道需要从firebase 使用 查询 ,但是如何使用 query ,我现在不明白。 这是我的代码: 如何使用 Firebase中的* 数据在用户附近自动 排序 地址? * 问题答案: 这是一个复杂的过程,需要多个步骤
我有一个web和一个使用SQL Server的移动字典应用程序。我试图实现一个简单版本的“你的意思”功能。如果用户输入的短语在数据库中不存在,我需要提出建议。
问题内容: 我已经使用AJAX获得了以下对象并将它们存储在数组中: 如何仅使用JavaScript 创建一个函数以按属性 升序 或 降序 对对象进行排序? 问题答案: 按价格升序对房屋进行排序: 或在ES6版本之后:
问题内容: 我在Swift Beta中实现一种算法,发现性能非常差。深入研究后,我意识到瓶颈之一就是对数组进行排序一样简单。相关部分在这里: 在C ++中,类似的操作在我的计算机上花费 0.06s 。 在Python中,它花费 0.6秒 ( 绝招 ,仅y =整数列表的sorted(x))。 在Swift中,如果使用以下命令进行编译,则需要 6s : 如果使用以下命令进行编译,则 最多 需要 88s
问题内容: 例如具有以下代码: 我如何排序此json这样- 我用ID对用户进行了排序。. 我不知道如何在javascript中执行此操作。 问题答案: 首先,这 不是 JSON。这是一个JavaScript对象文字。JSON是数据的 字符串表示 形式,它恰好非常类似于JavaScript语法。 其次,您有一个对象。他们没有排序。不能保证元素的顺序。如果要保证顺序,则 需要 使用数组。这将需要您更改
问题内容: 我有这种格式的数组: 如何按该字段的降序对该格式的数组排序?是否有内置功能? 问题答案: 使用并提供您自己的功能进行订购,例如