2012-11-07 10 views
2

我想爲我的ajax聊天系統編寫一個小幫手類,我正在嘗試添加我可能需要的基本功能。一起運行多個javascript對象方法

var strings = { 
     filterWords: ["fool", "dumb", "arse"], 
     removeSpecialChars: function (str) { 
      return str.replace(/[^\w\s]/gi, ''); 
     }, 
     killSpace: function (str) { 
      return str.replace(/\s/g, ''); 
     }, 
     reduceSpace: function (str) { 
      return str.replace(/\s+/g, ' '); 
     }, 
     allowLetsAndNums: function (str) { 
      return str.replace(/[^A-Za-z0-9]/g, ' '); 
     }, 
     allowLets: function (str) { 
      return str.replace(/[^A-Za-z]/g, ' '); 
     }, 
     allowNums: function (str) { 
      return str.replace(/[^0-9]/g, ' '); 
     }, 
     wordFilter: function (str) { 
      var rgx = new RegExp(this.filterWords.join("|"), "gi"); 
      return str.replace(rgx, "****"); 
     } 
    } 

什麼,我發現是我可能需要運行多種方法一起我問什麼要做到這一點,最好的做法不低於造成?

alert(strings.wordFilter(strings.reduceSpace(strings.allowLets("efgwge @£235%^@£ fool you a dumb arse432345$%^")))); 

感謝

+0

創建橋方法,將你做它。 – iMoses

+0

嘗試擁有一組函數,然後遍歷每個函數。將先前的結果傳遞給下一個呼叫,直到完成。 – Joseph

回答

3

你能做出這樣一個流暢的界面,讓這樣的代碼:

var x = new Validation("efgwge @£235%^@£ fool you a dumb arse432345$%^"); 
alert(x.allowLets().reduceSpace().wordFilter().result()); 
// alerts "efgwge **** you a **** ****" 

主代碼會需要是:

var Validation = function(str) { 
    this.str = str; 
    filterWords = ["fool", "dumb", "arse"] 
    this.removeSpecialChars = function() { 
     this.str = this.str.replace(/[^\w\s]/gi, ''); 
     return this; 
    };  
    this.killSpace = function() { 
     this.str = this.str.replace(/\s/g, ''); 
     return this; 
    }; 
    this.reduceSpace = function() { 
     this.str = this.str.replace(/\s+/g, ' '); 
     return this; 
    }; 
    this.allowLetsAndNums = function() { 
     this.str = this.str.replace(/[^A-Za-z0-9]/g, ' '); 
     return this; 
    }; 
    this.allowLets = function() { 
     this.str = this.str.replace(/[^A-Za-z]/g, ' '); 
     return this; 
    }; 
    this.allowNums = function() { 
     this.str = this.str.replace(/[^0-9]/g, ' '); 
     return this; 
    }; 
    this.wordFilter = function() { 
     var rgx = new RegExp(filterWords.join("|"), "gi"); 
     this.str = this.str.replace(rgx, "****"); 
     return this; 
    }; 
    this.result = function(){ 
     return this.str; 
    }; 
} 

活生生的例子:http://jsfiddle.net/fb7en/

+0

真的很喜歡這種做法,對我來說似乎是最清晰和最清潔的感謝 – user1503606

1

你可以擴展字符串原型:

String.prototype.removeSpecialChars = function() { 
return this.replace(/[^\w\s]/gi, ''); 
} 
String.prototype.killSpace = function() { 
return this.replace(/\s/g, ''); 
} 

var foo = "This is my§$% String"; 
​document.write​(foo.removeSpecialChars​().killSpace());​ 
1

您可以添加功能到String.prototype所以你可以這樣調用函數:

String.prototype.killSpace = function() { 
    return this.replace(/\s/g, ''); 
} 
String.prototype.reduceSpace = function() { 
    return this.replace(/\s+/g, ' '); 
} 

"foo bar".reduceSpace().killSpace(); // => returns foobar 

唯一的缺點是,你不能迭代通過for..in循環的字符串,然後因爲它將列出該方法作爲成員,並且目前沒有跨瀏覽器的方式使它不可迭代(IE不支持它)。

0

你可能會考慮一個可鏈接的API爲你的對象:

var StringFilter = { 
    _string: '', 
    string: function (string) { 
     this._string = string || ''; 
     return this; 
    }, 
    filterWords: ["fool", "dumb", "arse"], 
    removeSpecialChars: function() { 
     this._string = this._string.replace(/[^\w\s]/gi, ''); 
     return this; 
    }, 
    killSpace: function() { 
     this._string = this._string.replace(/\s/g, ''); 
     return this; 
    }, 
    reduceSpace: function() { 
     this._string = this._string.replace(/\s+/g, ' '); 
     return this; 
    }, 
    allowLetsAndNums: function() { 
     this._string = this._string.replace(/[^A-Za-z0-9]/g, ' '); 
     return this; 
    }, 
    allowLets: function() { 
     this._string = this._string.replace(/[^A-Za-z]/g, ' '); 
     return this; 
    }, 
    allowNums: function() { 
     this._string = this._string.replace(/[^0-9]/g, ' '); 
     return this; 
    }, 
    wordFilter: function() { 
     var rgx = new RegExp(this.filterWords.join("|"), "gi"); 
     this._string = this._string.replace(rgx, "****"); 
     return this; 
    }, 
    select: function() { 
     return this._string; 
    } 
}; 

StringFilter 
    .string("efgwge @£235%^@£ fool you a dumb arse432345$%^") 
    .allowLets() 
    .reduceSpace() 
    .wordFilter() 
    .select(); 
+0

好主意,爲什麼沒有*我*想到這個;) – Jamiec

+0

你有一個非常相似的想法,你的異步操作有利於新對象。 ;) – FloHimself

相關問題