首先,我抓住用户输入的搜索词并将其存储在变量'searchWord'中然后定义零售商数组并在变量'subStringLength'中设置此数组的长度。现在我运行w while循环检查我的'searchWord'中的任何单词,如果找到匹配则返回true。问题是indexOf()只返回一个数字或布尔值。如果它匹配任何带有'searchWord'的单词,我将如何调整此代码,如果返回它匹配的单词的值。然后,如果使用用于存储该零售商的凭证代码的对象密钥,我可以接受该字并匹配?任何帮助表示感谢,到目前为止我是如何做到的:
const searchWord = $('.form-control').val();
const searchRetailers =['Debenhams','debenhams', 'Argos', 'argos', 'Currys', 'currys', 'PC World', 'Pc World', 'pc World', 'pc world', 'John Lewis', 'john Lewis', 'john lewis','eBay', 'Ebay', 'ebay', 'Amazon', 'amazon'];
let subStringLength = searchRetailers.length;
while(subStringLength--) {
if (searchWord.indexOf(searchRetailers[subStringLength])!=-1) {
// show popup 1
}else {
// show popup 2
}
}
答案 0 :(得分:0)
如果匹配任何单词,我将如何调整此代码 ' searchWord',如果返回它匹配的单词的值。
找到匹配值时停止遍历是合理的:
...
var matched = '';
while (subStringLength--) {
if (searchWord.indexOf(searchRetailers[subStringLength]) !== -1) {
matched = searchRetailers[subStringLength]; // <-- capturing matched word
break;
}
}
另一种方法是使用Array.prototype.some()函数:
...
var matched,
hasMatches = searchRetailers.some(function(w){
var m = searchWord.indexOf(w) !== -1;
if (m) matched = w; // <-- capturing matched word
return m;
}, matched);
if (hasMatches) {
// show popup 1
} else {
// show popup 2
}
答案 1 :(得分:0)
我不推荐这种类型的搜索,因为通常可以通过设计用于索引/搜索这样的值的数据库来更好地处理它,但是,我给你一些粗略的代码,但基本上你可以这样做:
const searchWord = $('.form-control').val();
const searchRetailers =['Debenhams','debenhams', 'Argos', 'argos', 'Currys', 'currys', 'PC World', 'Pc World', 'pc World', 'pc world', 'John Lewis', 'john Lewis', 'john lewis','eBay', 'Ebay', 'ebay', 'Amazon', 'amazon'];
function search(searchWord) {
searchWord = searchWord.toLowerCase();
let results = [];
searchRetailers.forEach(function(el){
if(el.toLowerCase().indexOf(searchWord) != -1)
results.push(el);
});
return results;
}
let matches = search(searchWord);
//Do stuff with matches
答案 2 :(得分:0)
感谢大家的回答。我最终以下面的方式进行,因为我不需要一个数组和一个存储零售商代码的对象,我使用正则表达式来匹配对象键值。这种方式似乎比使用似乎相当慢的indexOf()更有效。
const searchRetailersCode = {
'debenhams': {
'code': 'YH99'
},
'argos': {
'code': 'HOME25'
},
'currys': {
'code': '123456'
},
'pc world': {
'code': '123456'
},
'john lewis': {
'code': '123456'
},
'ebay': {
'code': '123456'
},
'amazon': {
'code': '123456'
},
};
const searchWord = $('.form-control').val();
let regexp = new RegExp('(' + Object.keys(searchRetailersCode).join('|') + ')', 'i');
let matches = regexp.exec(searchWord);
if (matches != null && matches.length > 1) {
let retailer = matches[1].toLowerCase();
let discountCode = searchRetailersCode[retailer].code;
}