![](/img/trans.png)
[英]How to search a string for all values contained in an Array of strings? (Javascript)
[英]How to search Javascript Array, and return all strings in array that start with X
我想知道搜索javascript數組字符串的最佳方法是什么,並返回該數組中以給定字符串開頭的所有字符串。
如果有人有任何想法,或者有更簡單的方法來實現這一點,請幫助我!
例如,
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
因此,如果我使用searchString
搜索arrayOfStrings
,它將返回plum
和peach
編輯我更新了我的答案,因為下面的評論指出,感謝cookie怪物和Havenard
嘗試陣列過濾器
var re = new RegExp('^' + searchString);
var matches = arrayOfStrings.filter(re.test, re);
UPDATE
如果你想要它不區分大小寫:
var re = new RegExp('^' + searchString, 'i');
請注意,如果您的搜索字符串包含特殊字符,則需要先將它們轉義,因為字符串的工作方式。 感謝Alex Pakka指出這一點。
解決方案之一:
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
var result = []
arrayOfStrings.forEach(function(entry) {
if(entry.indexOf(searchString)==0)
{ result.push(entry);
}
});
var searchString = /^p/;
var result = arrayOfStrings.filter(function(str){
return searchString.test(str)
};
如果您需要短而快,請使用filter()和indexOf()作為建議的接受答案。
這是一個面向速度的版本,只有當數組至少有20個元素大或者更大並且你需要執行大量搜索時才會有所幫助:
//somewhere in your initialization code, extend array prototype
Array.prototype.binaryPrefixFilter = function(find) {
var low = 0, high = this.length - 1,
i, el;
while (low <= high) {
i = Math.floor((low + high) / 2);
el = this[i];
if (el.indexOf(find)==0) {
//go left and right to find elements
var start = i, end = i;
while (--start > 0 && this[start].indexOf(find)==0);
while (++end < this.length && this[end].indexOf(find)==0);
return this.splice(start+1,end-start-1);
}
if (el < find) { low = i + 1; }
else { high = i - 1; };
}
return [];
};
//actual use, notice sort() at the end
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"].sort();
console.log(arrayOfStrings.binaryPrefixFilter("p")); //["peach","plum"]
顯然,如果要創建庫,則不應更改Array
原型,但這超出了本答案的范圍。
更新:速度比較
以下是i7上Chrome 35中的真實數字,包含100個真實世界英文名稱。
10k searches with `fitler(regExp.test, regExp)` : 119ms
10k searches via binary search as above: 11ms
看到這個小提琴玩。 因此,除非您在服務器端像nodeJs一樣,否則可能不需要它。
這有幾種方法:
var exp1 = /^[p]/;
var results = ["apple", "banana", "peach", "orange", "plum"].filter(
function(item){ return exp1.test(item); });//returns plum and peach
使用Array.prototype.filter
可以過濾數組中的項目。 使用RegEx,您可以使用簡單的復雜匹配表達式。
function search_starting_with(haystack, needle)
{
var result = [];
for (var i in haystack)
if (haystack[i].indexOf(needle) == 0)
result[result.length] = haystack[i];
return result;
}
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
alert(search_starting_with(arrayOfStrings, searchString));
此解決方案也應該這樣做:
var filteredArrayOfStrings = arrayOfStrings.filter(function (v) { return v.indexOf(searchString) == 0; });
嘗試使用字符串indexOf()方法:
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
var results = [];
for(var i = 0;i<arrayOfStrings.length;i++){
var temp = arrayOfStrings[i].indexOf(searchString);
if(temp == 0)
results.push(arrayOfStrings[i]);
}
return results;
var resultArr = ["apple", "banana", "peach", "orange", "plum"].filter(function(v){ return v[0]=='p' });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.