所以我有一个随机的javascript名称数组…
[@ larry,@ nicholas,@ notch]等
它们都以@符号开头。我想按Levenshtein距离对它们进行排序,以使列表顶部的那些最接近搜索词。目前,我有一些使用jQuery的javascript,.grep()它使用javascript .match()方法在按键时输入的搜索词周围:
.grep()
.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元素是它每次在数组中附加到的元素,这将基于输入的搜索词形成一个名称列表。
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()方法的一般理解。感谢您的帮助,谢谢。
.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]; }