文字N回繰り返す


602

Perlでは、構文を使用して文字を複数回繰り返すことができます。

$a = "a" x 10; // results in "aaaaaaaaaa"

JavaScriptでこれを実現する簡単な方法はありますか?私は明らかに関数を使用できますが、組み込みのアプローチや他の巧妙な手法があるかどうか疑問に思っていました。

回答:


1201

最近、repeat文字列メソッドほとんどどこにでも実装されてます。(これはInternet Explorerにはありません。)したがって、古いブラウザーをサポートする必要がない限り、次のように書くだけです。

"a".repeat(10)

以前はrepeat、このハックを使用していました:

Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"

(長さが11の配列は、配列要素のArray.join引数置くため、10 "a"しか得られないことに注意してください。)

Simonはまた、このjsperfによると、SafariとChrome(Firefoxは除く)では、forループを使用して追加するだけで文字を複数回繰り返す方が高速であるように見えます(少し簡潔ですが)。


4
プラス、あなたの代わりに、固定長の変数を使用することができます-アレイ(20-LEN)は、パッドに20までの文字列を言う
ジョン・C

7
loopメソッドはより高速ですが、より冗長です。さらに、配列の長さが可変である場合にこれが一般的に有用である場合、たとえばArray(rawValue.length + 1).join("*")
Dexygen

0と1の場合、同じ結果が得られるため、これは機能しません。
ライアン

2
式はArray(n+1).join("a")です。n = 0の場合は空の文字列を返し、n = 1の場合はを返します"a"。だから私はそれがすべての場合にうまくいくと思います。
Jason Orendorff 2017

1
@Neelそれは、JSエンジンが文字列の長さに制限を課しているためです。ChromeとFirefoxでは、上限は2 ^ 30(約10億)に近いです。10 ^ 12は1兆です。
Jason

301

新しいES6ハーモニーでは、これをリピートで行うネイティブな方法があります。また、ES6は現在実験段階にあり、この機能はEdge、FF、Chrome、Safariですでに利用可能です

"abc".repeat(3) // "abcabcabc"

そして確かにリピート機能が利用できないならば、あなたは古き良きものを使うことができます Array(n + 1).join("abc")


54

自分を何度も繰り返す場合に便利です。

String.prototype.repeat = String.prototype.repeat || function(n){
  n= n || 1;
  return Array(n+1).join(this);
}

alert(  'Are we there yet?\nNo.\n'.repeat(10)  )


53
ビルトインのプロトタイプを汚染するのは悪いコーディング習慣です。
tuomassalo

3
@nurettinについて詳しくは、programmers.stackexchange.com / questions / 104320 /…を参照してください。(適切にスコープされた)静的ヘルパー関数を、のシグネチャで追加しますrepeat(str, n)
tuomassalo 2013年

4
n= n || 1パーツを削除する(またはnが未定義かどうかを確認する)ので、繰り返し0もできます。
chodorowicz 2013

3
ES6のためのMozillaの公式ポリフィルを見てもを持っている:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Eirik BIRKELAND

3
@ChrisV String.repeatはES6でのみ追加され、2015年6月まで確定されていませんでした。そのため、私の指摘は2012年に書いたときに有効だったと思います。:)
tuomassalo

13

最もパフォーマンスに優れた方法は、https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeatです

ショートバージョンは以下です。

  String.prototype.repeat = function(count) {
    if (count < 1) return '';
    var result = '', pattern = this.valueOf();
    while (count > 1) {
      if (count & 1) result += pattern;
      count >>>= 1, pattern += pattern;
    }
    return result + pattern;
  };
  var a = "a";
  console.debug(a.repeat(10));

Mozillaのポリフィル:

if (!String.prototype.repeat) {
  String.prototype.repeat = function(count) {
    'use strict';
    if (this == null) {
      throw new TypeError('can\'t convert ' + this + ' to object');
    }
    var str = '' + this;
    count = +count;
    if (count != count) {
      count = 0;
    }
    if (count < 0) {
      throw new RangeError('repeat count must be non-negative');
    }
    if (count == Infinity) {
      throw new RangeError('repeat count must be less than infinity');
    }
    count = Math.floor(count);
    if (str.length == 0 || count == 0) {
      return '';
    }
    // Ensuring count is a 31-bit integer allows us to heavily optimize the
    // main part. But anyway, most current (August 2014) browsers can't handle
    // strings 1 << 28 chars or longer, so:
    if (str.length * count >= 1 << 28) {
      throw new RangeError('repeat count must not overflow maximum string size');
    }
    var rpt = '';
    for (;;) {
      if ((count & 1) == 1) {
        rpt += str;
      }
      count >>>= 1;
      if (count == 0) {
        break;
      }
      str += str;
    }
    // Could we try:
    // return Array(count + 1).join(this);
    return rpt;
  }
}

これは優れた機能ですが、新しいネイティブの「繰り返し」はさらに高速であり、とにかく実装する必要はありません。
Goty Metal 2017

1
の意味について詳しく教えてくださいcount >>>= 1, pattern += pattern;。それはどんな声明ですか?
Tsahi Asher 2017

では、これはネイティブリピートのポリフィルです。if (!String.prototype.repeat) {最初と}最後にを追加するだけです。
trlkly 2017年

>>> =参照(1 >>>カウント=カウントのような)の符号なし右シフトの割り当てであるdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...は
user1441004

12

別の方法は次のとおりです。

for(var word = ''; word.length < 10; word += 'a'){}

複数の文字を繰り返す必要がある場合は、条件を乗算します。

for(var word = ''; word.length < 10 * 3; word += 'foo'){}

注:のように1だけオーバーシュートする必要はありません。word = Array(11).join('a')



10

すべてのブラウザ

次の関数は、承認された回答で提案されているオプションよりもはるかに高速に実行されます。

var repeat = function(str, count) {
    var array = [];
    for(var i = 0; i < count;)
        array[i++] = str;
    return array.join('');
}

次のように使用します。

var repeatedString = repeat("a", 10);

この関数のパフォーマンスを、承認済みの回答で提案されているオプションのパフォーマンスと比較するには、このフィドルこのフィドルを参照してください、ベンチマークを。

最新のブラウザのみ

最近のブラウザーでは、次のString.prototype.repeatメソッドを使用してこれを実行できます。

var repeatedString = "a".repeat(10);

MDNでこのメソッドの詳細を読んでください。

このオプションはさらに高速です。残念ながら、これはInternet Explorerのどのバージョンでも機能しません。表の番号は、メソッドを完全にサポートする最初のブラウザバージョンを示しています。

ここに画像の説明を入力してください


9
Array(10).fill('a').join('')

最も投票数の多い回答はもう少しコンパクトですが、この方法では、配列項目を追加する必要はありません。


1
残念ながら、fillメソッドはIEではサポートされていません。IEと互換性がない場合は、repeatメソッドも使用できます。
ミシエル

1
fill()同じことをjoin("a")単独で行う場合、なぜ追加のメソッドを使用するのですか?
vsync

7
/**  
 * Repeat a string `n`-times (recursive)
 * @param {String} s - The string you want to repeat.
 * @param {Number} n - The times to repeat the string.
 * @param {String} d - A delimiter between each string.
 */

var repeat = function (s, n, d) {
    return --n ? s + (d || "") + repeat(s, n, d) : "" + s;
};

var foo = "foo";
console.log(
    "%s\n%s\n%s\n%s",

    repeat(foo),        // "foo"
    repeat(foo, 2),     // "foofoo"
    repeat(foo, "2"),   // "foofoo"
    repeat(foo, 2, "-") // "foo-foo"
);

7

ES2015 / ES6で使用できます "*".repeat(n)

これをプロジェクトに追加すれば、準備は完了です。

  String.prototype.repeat = String.prototype.repeat || 
    function(n) {
      if (n < 0) throw new RangeError("invalid count value");
      if (n == 0) return "";
      return new Array(n + 1).join(this.toString()) 
    };

SCRIPT5029:この方法を使用する場合、配列の長さは有限の正の整数でなければなりません
andrepaulo

5

n文字をすばやく繰り返す別の興味深い方法は、高速指数アルゴリズムのアイデアを使用することです。

var repeatString = function(string, n) {
    var result = '', i;

    for (i = 1; i <= n; i *= 2) {
        if ((n & i) === i) {
            result += string;
        }
        string = string + string;
    }

    return result;
};

なぜ「おもしろい方法」と言うのですか?ここで何がとても面白いのですか?これは明らかなソリューションであり、コンピュータプログラムの最も基本的な基本的な例です。
vsync 2018

2

プロジェクトの値を繰り返すには、繰り返しを使用します

例えば:

var n = 6;
for (i = 0; i < n; i++) {
    console.log("#".repeat(i+1))
}

ただし、このメソッドはECMAScript 6仕様に追加されているので注意してください。


2
function repeatString(n, string) {
  var repeat = [];
  repeat.length = n + 1;
  return repeat.join(string);
}

repeatString(3,'x'); // => xxx
repeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹"

1

これが私が使うものです:

function repeat(str, num) {
        var holder = [];
        for(var i=0; i<num; i++) {
            holder.push(str);
        }
        return holder.join('');
    }

0

私は上の拡大するつもりだボンボンの答え@。彼の方法は、誰かがそれを行う必要がある場合に備えて、「既存の文字列にN文字を追加する」簡単な方法です。たとえば、「a google」は1の後に100のゼロが続くためです。

for(var google = '1'; google.length < 1 + 100; google += '0'){}
document.getElementById('el').innerText = google;
<div>This is "a google":</div>
<div id="el"></div>

注:元の文字列の長さを条件に追加する必要があります。



0
var stringRepeat = function(string, val) {
  var newString = [];
    for(var i = 0; i < val; i++) {
      newString.push(string);
  }
  return newString.join('');
}

var repeatedString = stringRepeat("a", 1);

0

ワンライナーとしても使用できます:

function repeat(str, len) {
    while (str.length < len) str += str.substr(0, len-str.length);
    return str;
}

どのコンテストでも、「for」の方が「while」よりも高速です。:-)
junihh


0

これは、Array()とjoin()を使用して関数を呼び出し、結果を取得する方法です。

function repeatStringNumTimes(str, num) {
  // repeat after me
  return num > 0 ? Array(num+1).join(str) : "";
}

console.log(repeatStringNumTimes("a",10))


-1
String.prototype.repeat = function (n) { n = Math.abs(n) || 1; return Array(n + 1).join(this || ''); };

// console.log("0".repeat(3) , "0".repeat(-3))
// return: "000" "000"

1
これString.prototype.repeatは、現在のブラウザにネイティブに含まれているものを上書きします。また、なぜそれを縮小するのですか?すべてを1行で記述する必要はありません。
Blender

IEには「繰り返し」機能がないため、プロトタイプが必要です。
Caglayan ALTINCI 2016年

-3

これはES6バージョンです

const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
repeat("A",20).forEach((a,b) => console.log(a,b+1))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.