2017-02-15 10 views
0

Во-первых, я захватываю поисковый запрос, который пользователь ввел и сохранил в переменной «searchWord». Затем определив массив розничных продавцов и установив длину этого массива в переменной ' subStringLength. Теперь я запускаю цикл while, который проверяет любое из слов в моем «searchWord», и если он находит совпадение, он возвращает true. Проблема indexOf() возвращает только число или логическое значение. Как бы я адаптировал этот код так, чтобы он соответствовал любому из слов с помощью слова «searchWord», если возвращает значение слова, которое оно соответствовало. Затем я могу взять это слово и сопоставить, если с ключом объекта, который используется для хранения кодов ваучера для этого продавца? Любая помощь приветствуется, вот как я это делаю до сих пор:Javascript проверить условия поиска по массиву и возвращаемому значению

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 
    } 
} 
+1

Можете ли вы опубликовать пример того, что может быть 'searchWord'! –

+0

, так что словом поиска может быть «Argos television» или «дешевый шарф debenhams» –

ответ

0

Как бы адаптировать этот код, если он совпадает с любым из слов с «Поиск слова», если возвращает значение слова его соответствует.

Было бы целесообразно, чтобы остановить обход когда подобрано значение найдено:

... 
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 
} 
0

Я не рекомендую этот тип потому что он обычно лучше обрабатывается базой данных, которая предназначена для индексирования/поиска значений, подобных этому, однако я givi что вы можете сделать примерно так:

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 
0

Спасибо за ответы каждого. Я закончил работу следующим образом, так как тогда мне не нужен массив и объект, хранящий код для розничных продавцов, я использовал regex для соответствия значению ключа объекта. Этот способ кажется более эффективным, чем использование 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; 
}