重箱の隅かしら?
2007-05-06


「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() } );
とかってのでもいいのか。
[JavaScript]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット