String擴展之Format

如果用過C#會發現String.Format是功能非常強大的字符串替換方法。

而在Js中,僅僅是提供了一個.replace方法。並且只能替換匹配到的第一字符串。需要進行大量的二次包裝或則循環使用。

當然也可以通過正則來進行。但是又相當的麻煩以及代碼的可讀性很差。

爲什麼我們不能通過對String的擴展來提供類似c#的String.Format的功能呢?

老規矩,核心代碼奉上。

String.prototype.Format = function () {
    var returnValue = this;
    for (var i = 0; i < arguments.length; i++) {
        var arg = arguments[i];
        var key = "";
        var value = "";
        //參數如果爲string 則使用傳統的查找{i}進行替換
        if (typeof arg == "string") {
            key = i;
            value = arg;
        } else if (arg instanceof Array) {
//如果參數爲數組則轉爲傳統的Format調用方式進行二次調用
            returnValue = returnValue.Format.apply(returnValue, arg);
            continue;
        } else {
//如果參數爲對象,則按照KeyValue數據格式進行替換
            key = arg.key;
            value = arg.value;
        }
//設置需要轉譯的保留符號
        var keySymple = [
           { reg: /\\/ig, value: "\\\\" },
           { reg: /\{/ig, value: "\\{" },
           { reg: /\}/ig, value: "\\}" },
           { reg: /\)/ig, value: "\\)" },
           { reg: /\(/ig, value: "\\(" },
        ]
//查找保留符號進行轉譯
        for (var j = 0; j < keySymple.length; j++) {
            var sympleReplace = keySymple[j];
            key = key.toString().replace(sympleReplace.reg, sympleReplace.value);
        }
        var reg = new RegExp("\\{" + key + "\\}", "ig");
        returnValue = returnValue.replace(reg, value);
    }
    return returnValue;
}

然後接着就是使用代碼了

var demoStr="this is a {0} {1}"
demoStr.Format("hot","day")//return "this is a hot day"
demoStr.Format(["hot","day"])//return "this is a hot day"
var demoStr="my name is {Name},age {Age}"
demoStr.Format({key:"Name",value:"Happy"},{key:"Age",value:"20"})
//return "my name is Happy,age 20"
demoStr.Format([{key:"Name",value:"Happy"},{key:"Age",value:"20"}])
//return "my name is Happy,age 20"

參數支持params和array兩種結構

同時支持string以及{key:,value:,}兩種數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章