js 實現 C# 的 format 方法


2014-11-08 12:18:51 更新,修復原形鏈方法被當作關鍵詞的bug,其實之前是想用全局關鍵詞的,不過還是算了,array里有太多單詞了。
                                現在 length callee 關鍵詞依然會被輸出,以后修復,現在為了精簡就將就着用了。
2014-08-26 14:55:30 更新,修復 
#5樓 沖動 兄弟提出的問題。

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

先來看下代碼吧。

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 種格式的參數替換。
但是也不是無懈可擊的,因為我的思路和原文完全相反。

思路是這樣的,利用正則匹配出字符串內所有 {key} 這樣的格式字符,然后把 key 當作對象對應的key或者數組對應的下標進行替換。
第一行  var _dic = typeof args === "object" ? args : arguments;  可以接受 3 種格式的數據。
多參數: arguments
數組: []
對象: {}
把這3種數據當作字典保存在 _dic 變量里。

下面正則替換替換函數里,其實就是進行查字典操作。
 return key in _dic ? _dic[key] : str; 
如果 _dic[key] 對應數據存在,就替換,否則就返回原始數據。
因為 arguments, [], {} 都可以當作字典來處理,所以就可用最簡單方法實現這種效果了。

同時缺陷也非常明確的暴露了,就是如果字符串里 {key} 這種參數非常多,但是替換的數據卻很少的時候,性能肯定不如他的方法。
但我覺得一般操作肯定都是參數對應進行替換的,這樣性能損耗就不用擔心了,因為對應了參數,損耗就是0。
反而比他那個多次正則替換來的快呢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM