JavaScriptのargumentsオブジェクトを使って文字列の複数置換の関数作ってみた

最近まで、JavaScriptのargumentsという機能を知らなかった自分。どうやら、関数内の引数を配列のように取得できる機能があるようです(参考:arguments – JavaScript | MDN)。

せっかくなので、何か作ってみようと思い、作ってみました。$の後に数値がついている文字列を、対応する引数の文字列に置換する関数です。

function pluralReplace(str){
    var len = arguments.length; // 引数の数
    var repStr = str; // 置換後の文字列
    var reg;
    for(var i=len-1;i>0;i--){
        reg = new RegExp("[$]" + i, "g")
        repStr = repStr.replace(reg, arguments[i]);
    }
    return repStr;
}

console.log( pluralReplace("select $1,$2,$3 from $4 where $1 > 10", "list_id", "name", "value", "test_table") );
    //=> "select list_id,name,value from test_table where list_id > 10"
console.log( pluralReplace("$1,$2,$3,$4,$5,$6,$7,$8,$9,$10", "りんご","ごりら","らっぱ","ぱいなっぷる","るーれっと","といれ","れいぞうこ","こいぬ","ぬいぐるみ","みかん") );
    //=> "りんご,ごりら,らっぱ,ぱいなっぷる,るーれっと,といれ,れいぞうこ,こいぬ,ぬいぐるみ,みかん 

なにげに、replaceの使いかたに手間取った。全ての同じ文字列を置換したいのと、最初に$がつく文字列ということにしたら、なんだかややこしいことになってしまった。もっと簡単に全て置換する方法がないものか・・・。

for文中のカウンタを大きい方から減らしていってるのは、小さいほうから増やしていくと”$1″が”$10″にも引っかかってしまうからです。最初1~9までという制限にしようかと思ったのですが、よくよく考えたら大きい方から見ていくだけで解決することに気づきました。

コメント

タイトルとURLをコピーしました