如何搜索Javascript数组,并返回数组中以X开头的所有字符串
How to search Javascript Array, and return all strings in array that start with X
我想知道搜索一个javascript字符串数组,并返回该数组中以给定字符串开头的所有字符串的最佳方法是什么。
如果有人有任何想法,或者如果JQuery有更简单的方法可以实现这一点,请帮助我!
例如,
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
因此,如果我用searchString
搜索arrayOfStrings
,它将返回plum
和peach
EDIT我更新了我的答案,正如下面的评论所指出的,这要归功于cookie怪物和Havenard
尝试阵列过滤器
var re = new RegExp('^' + searchString);
var matches = arrayOfStrings.filter(re.test, re);
更新
如果你想不区分大小写:
var re = new RegExp('^' + searchString, 'i');
请注意,如果搜索字符串包含特殊字符,则由于字符串的工作方式,您需要首先对其进行转义。感谢Alex Pakka指出这一点。
var searchString = /^p/;
var result = arrayOfStrings.filter(function(str){
return searchString.test(str)
};
解决方案之一:
var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
var result = []
arrayOfStrings.forEach(function(entry) {
if(entry.indexOf(searchString)==0)
{ result.push(entry);
}
});
如果您需要简短而快速的回答,请使用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
看看这把小提琴。因此,除非您像nodeJ一样在服务器端,否则可能不需要它。
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; });
http://jsfiddle.net/7MZYU/
var resultArr = ["apple", "banana", "peach", "orange", "plum"].filter(function(v){ return v[0]=='p' });
jsfiddle
尝试使用字符串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 exp1 = /^[p]/;
var results = ["apple", "banana", "peach", "orange", "plum"].filter(
function(item){ return exp1.test(item); });//returns plum and peach
使用Array.prototype.filter
,您可以从数组中筛选项目。使用RegEx,您可以使用简单或复杂的匹配表达式。
相关文章:
- 将组成单词的字符添加到数组的开头
- Javascript 不读取以 0 开头的数组项
- 在数组中查找颜色值(以#开头的字符串)
- 使用jQuery'在数组中循环;s中的每一个都会在生成字符串时在开头产生一个未定义的值
- Jquery 字符串替换,只替换数组的开头
- 查找数组并将其移动到多重数组的开头
- 在数组中向前和向后选择 X 个金额,如果需要,循环到开头和结尾
- JavaScript中的正则表达式获取以特定字符串开头的数组的所有字段
- 在 1 个不限于文本开头的属性上筛选对象数组
- 删除数组中以特定字符串开头的所有项
- 用Javascript对一个以特定字符串开头的数组进行排序
- 2d数组仅在以[0][x]开头时有效
- 如何将null值推送到数组的开头
- 如何计算数组中以最高数字开头的项目数
- 函数将项添加到数组的开头,而不使用unshift方法
- 如何删除数组中以0开头的项
- 如果数组元素以特定字母开头,则执行某些操作
- 当另一个元素以相同字母开头时,从字符串数组中删除一个元素
- 将元素添加到数组的末尾,从开头删除元素以保持数组的大小
- 如何搜索Javascript数组,并返回数组中以X开头的所有字符串