我想通过addind一个新的方法扩展Javascript内置的Array对象:searchByRegexp
基本上该方法将获得regexp作为输入并将返回:
_表示与正则表达式匹配的数组元素的字符串(如果有多个匹配,则返回第一个匹配)
如果没有元素与正则表达式匹配,则为空字符串。
答案 0 :(得分:6)
快速而肮脏(fiddle for your fiddling pleasure):
Array.prototype.searchByRegexp = function (rx) {
for(var i = 0, ln = this.length; i < ln; i++) {
// test item i
if(rx.test(this[i])) {
return this[i] + "";
}
}
// return an empty string if no matches are found
return "";
}
但是,您可能希望实现more general methods而不是......
Array.prototype.find = function(delegate) {
for(var i = 0, ln = this.length; i < ln; i++) {
if(delegate(this[i])){
return this[i];
}
}
return null;
}
Array.prototype.findAll = function(delegate) {
var results = [];
for(var i = 0, ln = this.length; i < ln; i++) {
if(delegate(this[i])){
results.push(this[i]);
}
}
return results ;
}
Array.prototype.each = function (delegate) {
for (var i = 0, ln = this.length; i < ln; i++) {
delegate(this[i], i);
}
}
...然后可以执行正则表达式比较:
// test values
var sizes = ["Small", "Medium", "Large", "Extra-Large", "Extra-Extra-Large"];
// Print single value or blank
document.write(sizes.find(function(size){
return /large/i.test(size);
}) || "");
// horizontal rule to separate our results
document.write("<hr/>");
// Print all matches
sizes.findAll(function(size){
return /large/i.test(size);
}).each(function(size){
document.write(size + "<br/>");
});
答案 1 :(得分:2)
到目前为止,使用Google Chrome浏览器,提供的解决方案打破了整个数组的迭代。
在Array.prototype.searchByRegexp = function ...
之后,如果您用for (var k in arrayInstance)
进行迭代,则值searchByRegexp
将出现在键中,而不仅仅是实际数组键。
为防止您应使用Object.defineProperty(Array.prototype, ...
Object.defineProperty(Array.prototype, 'searchByRegexp', {
value: function (rx) {
for(var i = 0, ln = this.length; i < ln; i++) {
// test item i
if(rx.test(this[i])) {
return this[i] + "";
}
}
// return an empty string if no matches are found
return "";
},
enumerable: false
});