Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 搜索给定单词的字符串_Javascript - Fatal编程技术网

Javascript 搜索给定单词的字符串

Javascript 搜索给定单词的字符串,javascript,Javascript,我有以下标题:香蕉核桃肉桂面包 我已经创建了一个搜索功能,允许用户输入自由文本,当我输入香蕉面包时,上面标题为:香蕉和胡桃肉桂面包的项目不会显示,因为我使用的是indexOf,但是如果标题是:香蕉面包和胡桃肉桂,那么它会工作,因为“香蕉面包”彼此相邻 有人能推荐一个javscript函数,它允许我搜索完整的字符串,并选择与我键入的内容匹配的单词吗 这是原作: if (searchDataList[i].ttl.toLowerCase().indexOf(freeText) > -1)

我有以下标题:香蕉核桃肉桂面包

我已经创建了一个搜索功能,允许用户输入自由文本,当我输入香蕉面包时,上面标题为:香蕉和胡桃肉桂面包的项目不会显示,因为我使用的是indexOf,但是如果标题是:香蕉面包和胡桃肉桂,那么它会工作,因为“香蕉面包”彼此相邻

有人能推荐一个javscript函数,它允许我搜索完整的字符串,并选择与我键入的内容匹配的单词吗

这是原作:

  if (searchDataList[i].ttl.toLowerCase().indexOf(freeText) > -1) {
    addItem = true;
  } 
  else {
    addItem = false;
  }

尝试拆分输入字符串,然后搜索每个单词。通过这种方式,您可以获得不同单词组合的结果。

您应该首先将您的
searchDataList
(我猜它当前是一个数组)转换为regexp,方法如下:

  • 假设
    searchDataList
    ['aa','bb','cc']
  • 制作相应的regexp
    /(aa | bb | cc)/g

然后,您可以将输入的单词提交到此regexp:返回的数组列出找到的单词。

简单的方法是将搜索文本拆分为单个单词并检查每个单词

var searchWords = freeText.split(' ');

searchWords = CleanWords(searchWords); // This removes words like '&', '-', 'the' 

for(var i = 0; i < searchDataList.length; i++){
  for (var n = 0; n < searchWords.length; n++){
    var word = searchWords[n].toLowerCase();
    var title = searchDataList[i].ttl.toLowerCase();

    if (title.indexOf(word) > -1){
      // addItem = true;
    } 
  }
}
另外,请看下面的答案,了解有关JavaScript中通过键访问对象项的速度的更多讨论


您也可以考虑使用<代码> var index =新的MAP();<代码>而不是一个对象(我不确定它是否更快)。

Twitter的typeahead/Hound是一个很好的插件,用于搜索查找反向索引,如果你的列表真的那么长的话。这是一个非常基本的信息检索理论。你应该考虑把它作为一个注释而不是一个答案,除非你打算对它进行扩展。我已经想过拆分字符串和搜索。然而,我们的列表很长,做一个foreach循环可能会很耗时。您应该首先让代码正常工作,然后在必要时担心性能。@miliesmith How-should-read?删除了我的评论。很抱歉我应该保持冷静。只是人们试图在所有事情上都使用正则表达式,而这并不是最好的答案。@millesmith是的,你对这个案例怎么看我不认为这是最好的解决方案:P.正则表达式只是告诉你是否有匹配项,而不是什么匹配项。此外,它确实没有加快任何速度,因为它仍然需要检查所有案例,直到找到一个。他也可以在空间上拆分,然后在数组上循环。这样一来,它就不再可读和可维护了。@MillieSmith我同意“它仍然需要检查所有的情况”,但它应该更快,因为它是内部的。另一方面,除非我忘记了什么,否则使用
g
修饰符将导致结果成为匹配单词的数组(若有)。
// Prebuild index
var index = {};
foreach(var item in searchDataList){
  var words = item.ttl.split(' ');
  words = CleanWords(words);   // This removes words like '&', '-', 'the' etc

  foreach(var word in words){
    word = word.toLowerCase();
    if (index[word]){
      index[word].Push(item.no);  // Build up array of search term indexes that contain this word.
    } else {
      index[word] = [item.no];
    }
  }
}

// Perform search
var searchWords = freeText.split(' ');
searchWords = CleanWords(searchWords);
foreach(var word in searchWords){
  var matches = index[word];
  foreach(var match in matches){
    // Do something with matches
    var matchedItem = searchDataList[match];
  }
}