Javascript检查数组和返回值的搜索项

时间:2017-02-15 22:18:46

标签: javascript arrays search

首先,我抓住用户输入的搜索词并将其存储在变量'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
    }
}

3 个答案:

答案 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; 
}