问题描述
假设我有以下数组:
const data = [{
label: 'Östra Halmgatan,Stockholm',value: 'Östra Halmgatan,Stockholm'
},{
label: 'Västra Vägen,value: 'Västra Vägen,{
label: 'Cykelvägen,Göteborg',value: 'Cykelvägen,Göteborg'
},{
label: 'Servicevägen,Köpenhamn',value: 'Servicevägen,Köpenhamn'
}
]}
我采取的第一步是实现一个用于检查距离的过滤器levenshtein算法。我过滤掉距离大于2的所有结果。
第一个问题是,当用户开始输入文字时,距离会很远。如果他们写“服务”,则距离为19,但显然应该显示Servicevägen,Köpenhamn
。我仅通过使用标签的子字符串(从0到userInput.length
)来解决此问题。在大多数情况下,这将导致正确的功能。因此,如果他们写Vöstra
(有错字),则只会显示Östra Halmgatan,Stockholm
和Västra Vägen,Stockholm
(因为这两个字符之间的距离为2或更小)。
但是,这导致了另一个问题。如果有人会写Stockholm
,那么当然应该显示前两个项目。我通过添加一个针对过滤器功能的修复程序对此进行了修复,该功能还检查了用户输入值是否包含在标签字符串中(所有字符串均设置为小写)。
这出奇地好,但是我仍然想知道是否有人可以帮助我解决这个问题。
例如,如果某人将使用非瑞典语键盘,那么如果他们要输入Göteborg
,则需要显示Goteborg
。使用include时,include从一开始就不会考虑拼写错误(或距离)。
基本上,我想知道是否有一种方法可以为考虑了距离的字符串编写包含函数?那将解决我的案例的所有用例。然后,我只能使用该函数,因为Vöstra
将对前两个返回true(假设距离设置为2或更小)。它也适用于Goteborg
和Stockholm
。
我在想的是您以……的风格编写函数
String.prototype.includesWithdistance(value: string,maxdistance: number) {
//... how would you approach this?
return substring (with a distance) is included
}
我看到很多可能的情况下都可以使用它,所以任何想法都会受到赞赏。
解决方法
您可能想尝试Smith-Waterman Gotoh
或Jaro-Winkler
算法进行这种计算。它更精确,并且能够处理错字。
您可以在此处测试您的比较: Test Similarity