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