重箱の隅かしら?2007年05月06日 05時01分58秒

「r : a」だと...

COLLECTION & COPYさんとこのエントリで次のようなコードが掲載されていた。

String.prototype.supplant = function (o) {
	return this.replace(/{([^{}]*)}/g,
		function (a, b) {
			var r = o[b];
			return typeof r === 'string' ?
			    r : a;
		}
	); 
};

var template = '<table border="{border}">' +
	'<tr><th>Last</th><td>{last}</td></tr>' +
	'<tr><th>First</th><td>{first}</td></tr>' +
	'</table>';
    
var data = {
	first: "Carl", 
	last: "Hollywood", 
	border: 2
};

mydiv.innerHTML = template.supplant(data);
Yahoo! Videoのコンテンツへリンクしていたが、どうもこれ、json.orgのこのページが元の模様。

中括弧で囲ったプロパティ名をパラメータとして渡したJSONデータのプロパティ値で置換するテンプレート機能を提供するメソッド定義みたいだが、このサンプルコードまんまだと、プロパティ値がstring以外の場合は元のテンプレートを採用するロジックになるので

<table border="{border}">(以下略)
にしかならないんだけど。まぁ、試せばすぐわかるので、わざわざこんなエントリぶちあげなくてもいいんだけどね。。。

こっちのほうがJavaScriptらしいかしら?

しかし、この方法は思いつかなかった。このブログでも以前String.formatというエントリで、似たような(似てないか)機能を提供するメソッドを掲載したが、これはメソッドの引数の位置による置換という方法をとっていた。

もともとが.NET FrameworkのString.Formatメソッドの劣化エミュレートだからこういうアプローチだったのだが、考えてみれば複雑なリフレクションを駆使しなくてもプロパティ名→値の機械的な置換が実現できるので、このほうがJavaScriptっぽいのかもしれない。

もっとも、String.formatは、ゆくゆくはDate/Numberにもformatメソッドを実装して、

"本日は{0:yyyy年MM月dd日}です。".format( new Date() );
// ↑ '本日は2007年05月06日です。'
とか、
"dara-jの小遣いは\{0:#,##0}です。".format( 3000 );
// ↑ 'dara-jの小遣いは\3,000です。'
みたいなことをしたいんだけどね。

うぉっと、これ、別に

"本日は{d:yyyy年MM月dd日}です。".format( { d : new Date() } );
とかってのでもいいのか。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/05/06/1486719/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。