Code Tips‎ > ‎

JavaScriptで文字列を指定回数繰返すrepeat関数の作成

同じ文字列パターンを指定回数分繰り返す文字列を取得したいというケースはしばしば遭遇します。思いつく範囲ではインデントの作成やpaddingの際などが挙げられます。

よく使いそうな機能なのに、標準では用意されていません。ここではシンプルな方法をいくつか紹介します。


最もオーソドックスで万能なのはループを使う方法です。この方法であれば、引数に負数・小数・文字列・大きな数が指定された場合でも、問題なく動作します。
/**
 * 繰り返し文字列の作成:ループを使う方法
 */
String.prototype.repeat = function(num) {
	for (var str = ""; (this.length * num) > str.length; str += this);
	return str;
};


配列とjoinを使う方法はトリッキーですが、シンプルに記述できます。そのせいか昔からよく使われています。しかし、引数に小数が指定されるとエラーになり、文字列が指定されると全く期待しない結果になってしまいます。そのため、汎用的に使用する場合には引数チェックを入れるべきでしょう。

しかし、ごちゃごちゃチェックを入れてしまうと、シンプルに記述できるというメリットが失われてしまうので、本末転倒です。ですので、引数に小数や文字列が指定されることが完全に保障できる環境下での使用に限定するといいと思います。
/**
 * 繰り返し文字列の作成:配列とjoinを使う方法
 */
String.prototype.repeat = function(num) {
	return Array(num + 1).join(this);
};


再帰で実装。オーソドックスでもシンプルでもないので、特に使用する場面はないかもしれません。また、再帰を使っているため大きな数を指定するとエラーになります。Win7+Chrome32の環境では、引数に16000を指定すると「RangeError: Maximum call stack size exceeded」になりました。一般的な使い方をする限りは万越えの文字列の作成はまずないと思いますが、万単位以上の繰り返しを指定したい場合には、再帰を使う方法は避けるべきでしょう。
/**
 * 繰り返し文字列の作成:再帰で実装
 */
String.prototype.repeat = function(n) {
	return (n < 1) ? "" : (n < 2) ? this : this.repeat(n - 1) + this;
};


変わったところでシフト演算で実装。ただしシフト演算を利用している性質上、引数に0以下や32以上が指定された場合には期待しない結果になってしまいます。オーソドックスでもシンプルでもなく、使用できる値も限られます。デメリットが多いので実際にはこの方法は特に使用する場面はないと思いますが、解法の一つとして挙げておきます。
/**
 * 繰り返し文字列の作成:シフトで実装
 */
String.prototype.repeat = function(n) {
	return (1 << n - 1).toString(2).replace(/./g, this);
};

使い方例
alert("ab".repeat(5));
→「ababababab」

2012/01/13
2014/02/20:再帰とシフトでの実装を追加