【问题标题】:Javascript: Find most relevant strings in an array from substringJavascript:从子字符串中查找数组中最相关的字符串
【发布时间】:2018-12-04 21:43:32
【问题描述】:

我有一个数组,其中包含与此类似的人的姓名(但要大得多):

let names = [
   "John Brown", 
   "Tristan Black", 
   "Carl Jobbs", 
   "Aidan Burrows", 
   "Taylor Joe"
];

基于输入,我试图返回数组中最相关的结果。目前我正在遍历名称数组并像这样检查它们:

if(name.toLowerCase().includes(input.toLowerCase()))
{
    console.log("Found match : " + name);
}

这显然不适合查找最相关的搜索结果,因为它会找到任何输入的名称。

理想情况下,我想做的是遍历名称数组并找到前 5 个(从某种意义上说,它们与输入最相似)结果。

我该怎么做?

【问题讨论】:

  • 定义most relevant。就 levenshtein 距离而言,最接近的结果是什么?
  • 从多少个字符开始?通常你会想在用户输入超过 2 个字符后开始你的search
  • 你熟悉Array.filter吗?
  • 这可能与您相关:github.com/gf3/Levenshtein Levenshtein 距离提供了一种度量来确定一个字符串与另一个字符串的相似性或“相关性”。您可能会发现根据这些字符串与输入字符串的 Levenshtein 距离对前 5 个字符串进行排序很有用
  • 我已经编辑了我的数组,因为我实际上在名称中包含了每个人的姓氏。理想情况下,如果输入是 Aid,例如它只会显示 Aidan Burrows,但如果我搜索 Burr,它只会显示 Aidan Burrows(因为那是他的姓氏)。同样,如果我搜索 Jo,它会同时显示 Carl Jobbs 和 Taylor Joe

标签: javascript arrays search


【解决方案1】:

如果我正确理解了你的问题,那么这个功能应该可以满足你的需要:

function filterByName(input, nameArray) {
  
  return nameArray.filter(name => (name.toLowerCase().includes(input.toLowerCase())))
}

let names = ["John Brown", "Tristan Black", "Carl Jobbs", "Aidan Burrows", "Taylor Joe"];

console.log('Found for Aid:', filterByName('Aid', names))
console.log('Found for Burr:', filterByName('Burr', names))
console.log('Found for Jo:', filterByName('Jo', names))

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2015-11-29
    • 2017-04-07
    • 2016-06-07
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多