js 實現 C# 的 format 方法

2014-11-08 12:18:51 更新,修復原形鏈方法被看成關鍵詞的bug,其實以前是想用全局關鍵詞的,不過仍是算了,array裏有太多單詞了。
                                如今 length callee 關鍵詞依然會被輸出,之後修復,如今爲了精簡就將就着用了。
2014-08-26 14:55:30 更新,修復 #5樓 衝動 兄弟提出的問題。javascript

其實我根本不會 C# 只是看到人家寫了個這種功能《js實現相似c#中的字符串處理方法format()
我看了下代碼,以爲思路繁瑣,因此簡化思路寫一個同樣的功能的方法,和你們分享下思路。php

先來看下代碼吧。html

String.prototype.format = function(args) { var _dic = typeof args === "object" ? args : arguments; return this.replace(/\{([^{}]+)\}/g, function(str, key) { // return key in _dic ? _dic[key] : str; return _dic.hasOwnProperty(key) ? _dic[key] : str; }); } var str = "參數{0}參數{1}參數{2}參數{3}參數{hehe}參數{{fuck}}參數{ooxx}"; console.log( str.format("001", "002") ); // 參數001參數002參數{3}參數{hehe}參數{{fuck}}參數{ooxx} console.log( str.format(["001", "002"]) ); // 參數001參數002參數{3}參數{hehe}參數{{fuck}}參數{ooxx} console.log( str.format([null, "", undefined, 1]) ); // 參數null參數參數undefined參數1參數{hehe}參數{{fuck}}參數{ooxx} console.log( str.format({hehe: "呵呵", fuck: "法克"}) ); // 參數{0}參數{1}參數{3}參數呵呵參數{法克}參數{ooxx} console.log( str.format({"1":"111", hehe: "呵呵", ooxx: "哈哈"}) ); // 參數{0}參數111參數{3}參數呵呵參數{{fuck}}參數哈哈 console.log( str.format({"1":undefined, hehe: null, ooxx: ""}) ); // 參數{0}參數undefined參數{2}參數{3}參數null參數{{fuck}}參數

代碼簡潔易懂,維護起來也很輕鬆,並且支持 3 種格式的參數替換。
可是也不是無懈可擊的,由於個人思路和原文徹底相反。java

思路是這樣的,利用正則匹配出字符串內全部 {key} 這樣的格式字符,而後把 key 看成對象對應的key或者數組對應的下標進行替換。
第一行  var _dic = typeof args === "object" ? args : arguments;  能夠接受 3 種格式的數據。
多參數: arguments
數組: []
對象: {}
把這3種數據看成字典保存在 _dic 變量裏。
c#

下面正則替換替換函數裏,其實就是進行查字典操做。
 return key in _dic ? _dic[key] : str; 
若是 _dic[key] 對應數據存在,就替換,不然就返回原始數據。
由於 arguments, [], {} 均可以看成字典來處理,因此就可用最簡單方法實現這種效果了。
數組

同時缺陷也很是明確的暴露了,就是若是字符串裏 {key} 這種參數很是多,可是替換的數據卻不多的時候,性能確定不如他的方法。
但我以爲通常操做確定都是參數對應進行替換的,這樣性能損耗就不用擔憂了,由於對應了參數,損耗就是0。
反而比他那個屢次正則替換來的快呢。函數

相關文章
相關標籤/搜索