如何搜索Javascript数组,并返回以X开头的数组中的所有字符串

时间:2014-06-18 00:38:01

标签: javascript

我想知道搜索javascript字符串数组的最佳方法是什么,并返回该数组中以给定字符串开头的所有字符串。

如果有人有任何想法,或者有更简单的方法通过JQuery实现这一点,请帮助我!

例如,

var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";

因此,如果我使用arrayOfStrings搜索searchString,则会返回plumpeach

8 个答案:

答案 0 :(得分:4)

编辑我更新了我的答案,因为下面的评论指出,感谢cookie monsterHavenard

尝试array filter

var re = new RegExp('^' + searchString);
var matches = arrayOfStrings.filter(re.test, re);

<强>更新

如果您希望它不区分大小写:

var re = new RegExp('^' + searchString, 'i');

请注意,如果搜索字符串包含特殊字符,则需要首先将其转义,因为字符串的工作方式。感谢Alex Pakka指出这一点。

答案 1 :(得分:1)

解决方案之一:

var arrayOfStrings = ["apple", "banana", "peach", "orange", "plum"];
var searchString = "p";
var result = []
arrayOfStrings.forEach(function(entry) {
   if(entry.indexOf(searchString)==0)
   {  result.push(entry);
   }
});

答案 2 :(得分:1)

var searchString = /^p/;
var result = arrayOfStrings.filter(function(str){
    return searchString.test(str)
};

答案 3 :(得分:1)

如果你需要短而快,请使用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原型,但这超出了此答案的范围。

更新: SPEED COMPARISON

以下是i7上Chrome 35中的实数,包含100个真实英文名称。

 10k searches with `fitler(regExp.test, regExp)` : 119ms 
 10k searches via binary search as above: 11ms

请参阅此fiddle进行播放。因此,除非您在服务器端像nodeJs一样,否则可能不需要它。

答案 4 :(得分:0)

这有几种方式:

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,您可以使用简单的复杂匹配表达式。

答案 5 :(得分:0)

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/

答案 6 :(得分: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;

答案 7 :(得分:0)

var resultArr = ["apple", "banana", "peach", "orange", "plum"].filter(function(v){ return v[0]=='p' });

jsfiddle

相关问题