Javascript - 创建一个新的Array方法

时间:2011-10-11 18:23:42

标签: javascript prototype-programming

我想通过addind一个新的方法扩展Javascript内置的Array对象:searchByRegexp

基本上该方法将获得regexp作为输入并将返回:
_表示与正则表达式匹配的数组元素的字符串(如果有多个匹配,则返回第一个匹配)
如果没有元素与正则表达式匹配,则为空字符串。

2 个答案:

答案 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
});