我有以下标题:Banana&核桃肉桂面包
我创建了一个搜索功能,允许用户输入自由文本,当我输入Banana Bread上面的标题为:Banana&核桃肉桂面包不会完全显示,因为我使用indexOf,但如果标题是:Banana Bread&核桃肉桂然后它会起作用,因为'香蕉面包'是彼此相邻的。
有人可以推荐一个javscript函数,它可以让我搜索完整的字符串并挑选出与我输入内容相匹配的单词吗?
这是原作:
if (searchDataList[i].ttl.toLowerCase().indexOf(freeText) > -1) {
addItem = true;
}
else {
addItem = false;
}
由于
答案 0 :(得分:0)
尝试拆分输入字符串,然后搜索每个单词。通过这种方式,您可以获得不同单词组合的结果。
答案 1 :(得分:0)
你首先应该将你的searchDataList
(我猜它现在是一个数组)变成regexp,这样:
searchDataList
为['aa', 'bb', 'cc']
/(aa|bb|cc)/g
然后您可以将输入的单词提交到此正则表达式:返回的数组列出找到的单词。
答案 2 :(得分:0)
这样做的简单方法是将搜索文本拆分为单个单词并检查每个单词......
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;
}
}
}
如果您不想这样做,那么您可以尝试预建索引并检查搜索词是否在索引中。下面的伪代码......
// 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];
}
}
另请参阅以下答案,以了解有关使用JavaScript中的对象按键访问项目的速度的更多讨论... Array vs. Object efficiency in JavaScript
您也可以考虑使用var index = new Map();
而不是对象(我不确定它是否更快)。