JavaScriptで,文字列を反復する / 逆順に並び替える方法
クイズ:JavaScriptで,
"文字列".func()
のような(メソッドチェーンができるような)形式で,
1. 文字列を逆順に並び変える方法は?
( PHPで言うと str_rev() 関数 )
2. 文字列を n 回反復する方法は?
( PHPで言うと str_repeat() 関数 )
3. 1 と 2 を使って,ひし形の図形を出力しなさい。
単純な for 文ではダメです。 (制限時間5分)
答案
1. JavaScriptで文字列を逆順にソートする方法
"文字列".split("").reverse().join("")
とすれば,「列字文」になる。
文字列をいったん1文字ずつ配列にばらしてから,配列を逆ソートし,再びつなぎ合わせて文字列にする。
2. JavaScriptで文字列を n 回繰り返す方法
new Array( n + 1 ).join( "文字列" )
とすれば,「文字列文字列文字列〜・・・文字列文字列」( n 回繰り返し)になる。
空の配列を n + 1 要素分作ってから,それら空の要素のすきまに文字列を入れてつなぎ合わせれば,ちょうど n 回の繰り返しになる。
しかし,これではメソッドチェーンが崩れてしまう。文字列の直後に new 云々と記述することはできない。
"文字列".func() のような形式で実現できないものか。
replace() の中に無理して for 文を詰め込めば,できる。
"文字列".replace( /.*/g, function(){ var temp = ""; for( var i = 0; i < 10; i ++ ){ temp += arguments[0]; } return temp; })
とすれば,「文字列文字列文字列〜・・・文字列」(10回繰り返し)になる。
一般的には,replace() の第一引数にはマッチさせたい正規表現を書き,第二引数には置換後の文字列を書くだろう。
この方法の場合,第二引数中の「$1」などを使えば,
"文字列".replace( /(.*)/g, "$1$1" )
のようにして,どうにか2回分の繰り返しを得る事もできる。
しかし,これでは「文字列を n 回繰り返したい」という場合に「$1」を n 回繰り返して指定することになり,結局いたちごっこである。
ところで replace() には,第二引数に関数を割り当てることもできる。下記URL参照。
JavascriptのString.replaceに無名関数を渡して複雑な置換
http://itmst.blog71.fc2.com/blog-entr...
その第二引数となった関数には,マッチした文字列等が渡される。
関数に渡された内容は,一般に arguments なる配列から取得できる。これを反復コピーして返すようにすればよい。
3. ひし型を出力したい
2.で挙げた後者の方法は少しやり過ぎだろう。
前者の new を使う方法を採用すると,例えば下記のようなコードになる。
<input type="button" value="ひし型を表示" onClick="f()"> <script language="JavaScript"> function f() { // 上半分 (文字列の反復を使う) var str = mypre.innerHTML = (function(){ var max = 10; var temp = ""; for( var i = 0; i < max; i ++ ){ temp += "\n" + new Array(max - i).join(" ") + new Array(2*i + 2).join("A") + new Array(max - i).join(" ") ; } return temp; })(); // 下半分 (文字列の逆ソートを使う) mypre.innerHTML += "\n" + str.split("").reverse().join(""); } </script> <pre id="mypre"></pre>
出力は
A AAA AAAAA AAAAAAA AAAAAAAAA AAAAAAAAAAA AAAAAAAAAAAAA AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAA AAAAAAAAAAAAA AAAAAAAAAAA AAAAAAAAA AAAAAAA AAAAA AAA A
と,見事な(?)ダイヤ形となる。(注:Firefoxで表示)
なお,改行符号として \n ではなく <br> を使うと,逆ソートした際に「>rb<」のような文字列が現れて悲しい結果になるので注意。
\n ならば1文字とみなされる。
関連する記事:
alert() と書くために,わざわざ行頭に戻らなくてもすむ方法
http://language-and-engineering.hatenablog.jp/entry/20100829/p1
JavaScript ショートコーディングの10のコツ
http://language-and-engineering.hatenablog.jp/entry/20081009/1223469525
JavaScriptで,動的に追加されたイベントリスナの実行順序を保証する方法
http://language-and-engineering.hatenablog.jp/entry/20081011/1223680301