2012-10-02 55 views
8

考慮到字符串數組:在Javascript中搜索字符串數組時可以使用通配符嗎?

x = ["banana","apple","orange"] 

有一個內置的快捷方式進行通配符搜索?

即,也許

x.indexOf("*na*") //returns index of a string containing the substring na 
+2

爲什麼不只是搜索'na'或使用正則表達式...你也可以增加字符串並編寫自己的。 – jahroy

+3

我會使用正則表達式,可能這可能有助於http://stackoverflow.com/questions/6333246/regex-wildcard-for-array-search – Rahul

+0

謝謝,正則表達式的建議幫助。也許把這個答案作爲一個答案「沒有捷徑,但使用正則表達式很容易」,代碼示例片段 – blueberryfields

回答

10

擴展Pim的答案,正確的方式來做到這一點(沒有jQuery)將是這樣的:

Array.prototype.find = function(match) { 
    return this.filter(function(item){ 
     return typeof item == 'string' && item.indexOf(match) > -1; 
    }); 
} 

但實際上,除非你在多個地方使用這個功能,你可以使用現有的filter方法:

var result = x.filter(function(item){ 
    return typeof item == 'string' && item.indexOf("na") > -1;    
}); 

正則表達式版本是相似的,但我認爲這將創建一個小bit更多的開銷:

Array.prototype.findReg = function(match) { 
    var reg = new RegExp(match); 

    return this.filter(function(item){ 
     return typeof item == 'string' && item.match(reg); 
    }); 
} 

它確實提供了靈活性,允許您指定一個有效的RegExp字符串,但。

x.findReg('a'); // returns all three 
x.findReg("a$"); // returns only "banana" since it's looking for 'a' at the end of the string. 
+1

好的答案。但是這個解決方案不適用於每一個字符串。考慮一下Url的情況,我們可以有'?'和'/'在字符串中。代碼將爲這些情況拋出一個錯誤。 – sachinjain024

0

您可以擴展陣列原型找到匹配數組中的

Array.prototype.find = function(match) { 
    var matches = []; 
    $.each(this, function(index, str) { 
     if(str.indexOf(match) !== -1) { 
      matches.push(index); 
     } 
    }); 
    return matches; 
} 

然後,您可以打電話找你的陣列上像這樣

// returns [0,3] 
["banana","apple","orange", "testna"].find('na'); 
+0

-1 jQuery每個 – Shmiddty

3

擴展上@ Shmiddty的答案,這裏是有用的JavaScript的想法:

  • 擴展磁盤陣列和一個新的方法:使用Array.prototype.method = function(arg) { return result; }
  • 濾波器陣列:Array.filter(function(e) { return true|false; })
  • 套用公式中的元素array:Array.map(function(e) { return formula(e); })
  • 使用正則表達式:/.*na.*/new Regex('.*na.*')
  • 使用正則表達式匹配:var result = regex.test(input);
  • 使用Array.prototype.reduce到數組中的每個元素上運行的功能之後aggergate結果

即我喜歡的輸入參數是一個正則表達式,所以,它給您:

  • 短,但普遍的模式匹配的輸入,
    • 如含有與啓動,結束的寬度,以及更復雜的匹配
  • 指定輸入模式作爲字符串

液1的能力:過濾器,測試,地圖和的indexOf

Array.prototype.find = function(regex) { 
 
    var arr = this; 
 
    var matches = arr.filter(function(e) { return regex.test(e); }); 
 
    return matches.map(function(e) { return arr.indexOf(e); }); 
 
}; 
 
var x = [ "banana", "apple", "orange" ]; 
 
console.log(x.find(/na/)); // Contains 'na'? Outputs: [0] 
 
console.log(x.find(/a/)); // Contains 'a'? Outputs: [0,1,2] 
 
console.log(x.find(/^a/)); // Starts with 'a'? Outputs: [0] 
 
console.log(x.find(/e$/)); // Ends with 'e'? Outputs: [1,2] 
 
console.log(x.find(/pear/)); // Contains 'pear'? Outputs: []

解決方案2:減少,測試

Array.prototype.find = function(regex) { 
 
    return this.reduce(function (acc, curr, index, arr) { 
 
    if (regex.test(curr)) { acc.push(index); } 
 
    return acc; 
 
    }, [ ]); 
 
} 
 
var x = [ "banana", "apple", "orange" ]; 
 
console.log(x.find(/na/)); // Contains 'na'? Outputs: [0] 
 
console.log(x.find(/a/)); // Contains 'a'? Outputs: [0,1,2] 
 
console.log(x.find(/^a/)); // Starts with 'a'? Outputs: [0] 
 
console.log(x.find(/e$/)); // Ends with 'e'? Outputs: [1,2] 
 
console.log(x.find(/pear/)); // Contains 'pear'? Outputs: []

0

使用正則表達式可以做到這一點在JavaScript

var searchin = item.toLowerCase(); 
var str = columnId; 
str = str.replace(/[*]/g, ".*").toLowerCase().trim(); 
return new RegExp("^"+ str + "$").test(searchin); 
相關問題