Javascript 包含的搜索字段的Levenshtein距离

Javascript 包含的搜索字段的Levenshtein距离,javascript,typescript,algorithm,levenshtein-distance,fuzzy-search,Javascript,Typescript,Algorithm,Levenshtein Distance,Fuzzy Search,假设我有以下数组: const data = [{ label: 'Östra Halmgatan, Stockholm', value: 'Östra Halmgatan, Stockholm' }, { label: 'Västra Vägen, Stockholm', value: 'Västra Vägen, Stockholm' }, { label: 'Cykelvägen, Göteborg', value: 'Cykelvägen, Göteborg' }

假设我有以下数组:

const data = [{
  label: 'Östra Halmgatan, Stockholm',
  value: 'Östra Halmgatan, Stockholm'
},
{
  label: 'Västra Vägen, Stockholm',
  value: 'Västra Vägen, Stockholm'
},
{
  label: 'Cykelvägen, Göteborg',
  value: 'Cykelvägen, Göteborg'
},
{
  label: 'Servicevägen, Köpenhamn',
  value: 'Servicevägen, Köpenhamn'
}
]}
我想有一个搜索,用户可以搜索模糊搜索的项目

我采取的第一步是实现一个过滤levenshtein算法来检查距离。我过滤掉距离大于2的所有结果

第一个问题是,当用户开始打字时,距离会很遥远。如果他们写“Serv”,它给出的距离为19,但它显然应该显示带有
Servicevägen,Köpenhamn
的项。我只为标签使用了一个子字符串(从0到
userInput.length
)。这将为大多数情况提供正确的功能。因此,如果他们写
Vöstra
(输入错误),它只会显示
Östra Halmgatan,斯德哥尔摩
Västra Vägen,斯德哥尔摩
(因为这两个的距离为2或更小)

然而,这导致了另一个问题。如果有人要写
Stockholm
,当然应该显示前两项。我通过为filter函数添加一个补丁修复了这个问题,该函数还检查标签字符串中是否包含用户输入值(所有字符串都设置为小写)

这项工作出人意料地好,但我仍然有一个问题,我想知道是否有人能帮我解决

例如,如果有人使用非瑞典键盘,如果他们要进入哥德堡,我需要显示
Göteborg
。使用include时,include不考虑输入错误(或距离),只从一开始就考虑

基本上,我想知道是否有一种方法可以为考虑距离的字符串编写包含函数?这将解决我的案例的所有用例。然后我只能使用该函数,因为
Vöstra
将在前两个函数中返回true(假设距离设置为2或更低)。它也适用于
哥德堡
斯德哥尔摩

我的想法是你用

String.prototype.includesWithDistance(value: string, maxDistance: number) {
    //... how would you approach this?
    return substring (with a distance) is included
}

我看到很多可能的情况下,这可以被使用,所以任何想法都是值得赞赏的。

你可能想尝试
Smith Waterman Gotoh
Jaro Winkler
算法进行这种计算。它更精确,能够处理打字错误

您可以在此处测试您的比较:

好吧!我想可能有人已经想到了,但我对算法不是很精通。一定会去看看的,谢谢你的提示!尝试使用js插件。它应该能帮到你。我正在试用演示,输入
Östra Halmgatan,斯德哥尔摩
斯德哥尔摩
只会返回“toc”:我不确定我是否遗漏了什么?