【问题标题】:Javascript - creating a new Array methodJavascript - 创建一个新的数组方法
【发布时间】:2011-10-11 18:23:42
【问题描述】:

我想通过添加一个新方法来扩展 Javascript 内置 Array 对象:searchByRegexp

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

【问题讨论】:

  • 什么阻碍了你?向原型添加一个函数,执行那个特定的函数......?你试过什么?
  • 只是为了兴趣或方便,有些图书馆已经这样做了。例如,请参阅Enumerable.grep

标签: javascript prototype-programming


【解决方案1】:

又快又脏 (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/>"); 
}); 

【讨论】:

  • 很好的答案,谢谢。我想把所有这些额外的功能放在一个文件中。它的名字有约定吗?我的意思是,对于扩展内置 javascript 对象原型的文件。
  • 我不知道原型扩展的任何文件命名约定。
【解决方案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
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多