2017-02-15 75 views
0

首先,我抓取用戶輸入的搜索詞並將其存儲在變量「searchWord」中,然後定義零售商數組並將該數組的長度設置爲變量' subStringLength」。現在我運行w 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電視」或「便宜的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

感謝大家的回答。我最終以如下方式進行,因爲我不需要一個數組和一個存儲零售商代碼的對象,我使用正則表達式來匹配對象鍵值。這種方式似乎比使用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; 
}