JavaScript文字列フォーマット出力

2273 ワード

jsの過程ではよく文字列を使ってつなぎ合わせます.多くの時にはこれらのつなぎ合わせは長又の硬いです.jsは他の言語のような文字列のフォーマット方式を提供していません.だからDIYしかないです.
一般的には、次の2つの方式のフォーマットを実現する必要があります.
"{0},{1},hehe".format("hello","world")
"  ={  },  ={  },hou".format({"  ":100,"  ":95})
第一に、通常の書式設定方法です.多くの言語でよく見られます.第二の種類はそんなによくないですが、Jsの中ではとても重要です.特にajaxインタラクティブの後、私達は一山のjsonデータを返します.もちろん多くの人が互換性のあるフォーマットを書いていますが、今日は他の方法を試してみます.
上の2つのフォーマットの話法をよく観察してみると、方法は同じであるが、パラメータは異なることがわかった.ちょうどJavaScript関数再負荷シミュレーション文の方法で積載していませんか?次のような実現があるべきです.
sm.Overload("format",String.prototype,{
	"string,string,string...." : function(a,b,c,....){
	              //pass
               },
	"object" : function(param){
	              //pass
                }
});
書き終わったらちょっと迷っています.私たちのオーバーロードの方法はfn_によるものです.obj対象のキーの値(上のコードの「string,string.」)は相対的に実現されたものを与えられますが、stringの個数は確かに不確定で、確定したキーの値としては使えません.
どうすればいいですか
簡単ですこの山のストリングスは一つのストリングスの集合を表しているのではないですか?Aray一つで表現すればいいですね.そして…
sm.Overload("format",String.prototype,{
	"array" : function(params){
		//params is a array
	},
	"object" : function(param){
		//param is a object
	}
});
残りのコードは書きやすいです.
sm.Overload("format",String.prototype,{
	"array" : function(params){
		var reg = /{(\d+)}/gm;
		return this.replace(reg,function(match,name){
			return params[~~name];
		});
	},
	"object" : function(param){
		var reg = /{([^{}]+)}/gm;
		return this.replace(reg,function(match,name){
			return param[name];
		});
	}
});
呼び出し:
"{0},{1},hehe".format(["hello","world"]); //hello,world,hehe
"  ={  },  ={  },hou".format({"  ":100,"  ":95});//  =100,  =95,hou
関数の署名と同じパラメータの異なる関数を方法によって重載するという利点が明らかになりました.一つ一つの場合、If、elseの山のように、行に対して新しい関数を書き出すことができます.他の形式のフォーマットがあれば、sm.OverloadでString.prototype.formatを拡張すればいいです.allメソッドにIfを追加するのではありません.