スポンサーリンク

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