web-dev-qa-db-ja.com

文字をN回繰り返す

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

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

Javascriptでこれを実現する簡単な方法はありますか?私は明らかに関数を使うことができますが、組み込みのアプローチ、あるいは他の巧妙なテクニックがあるのか​​どうかと思いました。

542
Steve

最近では、 repeat文字列メソッド が至る所に実装されていますほぼ。 (Internet Explorerにはない。)古いブラウザをサポートする必要がない限り、単に次のように書くことができます。

"a".repeat(10)

repeatの前に、このハックを使いました:

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

Array.joinは引数配列要素の間に置くので、長さ11の配列では10個の "a"しか使えません。)

Simonはまた、 このjsperf によると、SafariとChrome(Firefoxではなく)のほうが単純に文字を複数回繰り返す方が速いようだと指摘しています。 forループを使用して追加します(ただし、少し簡潔です)。

1095
Jason Orendorff

ES6の新しいハーモニーでは、 repeat でこれを行うためのネイティブな方法があります。またES6は今実験的になりました。この機能はEdge、FF、ChromeそしてSafariで すでに利用可能です

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

そして、繰り返し機能が利用できない場合は、きっと古き良きArray(n + 1).join("abc")を使うことができます。

293
Salvador Dali

あなたが自分自身をたくさん繰り返すのであれば便利です:

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)  )
50
kennebec

最もパフォーマンスの良い方法は、 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からのPolyfill:

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;
  }
}
13

代替案は以下のとおりです。

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

複数の文字を繰り返す必要がある場合は、条件式を掛けます。

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

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

12
bonbon

プロジェクトにライブラリを含めることに反対しないのであれば、lodashには繰り返し機能があります。

_.repeat('*', 3);
// → '***

https://lodash.com/docs#repeat

10
Nathan Danger

すべてのブラウザ用

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

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

あなたはこのようにそれを使うでしょう:

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

この関数のパフォーマンスを、受け入れられた回答で提案されているオプションのパフォーマンスと比較するには、 this Fiddle および ベンチマークの場合はこのフィドル

現代のブラウザのみ

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

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

このメソッドの詳細については、 MDN を参照してください。

このオプションはもっと速いです。残念ながら、Internet Explorerのどのバージョンでも動作しません。表内の数字は、このメソッドを完全にサポートする最初のブラウザバージョンを示しています。

enter image description here

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

最も投票された答えはもう少しコンパクトですが、このアプローチでは余分な配列項目を追加する必要はありません。

8
Grzegorz Pawlik
/**  
 * 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
yckart

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()) 
    };
7
webdeb

N文字を素早く繰り返しするためのもう1つの興味深い方法は、クイック指数アルゴリズムからのアイデアを使用することです。

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;
};
5
csharpfolk

私のプロジェクトで値を繰り返すために私は繰り返しを使用

例えば:

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
alejandro

これが私が使っているものです:

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

CoffeeScriptの場合:

( 'a' for dot in [0..10]).join('')
0
David Mendez

LodashJavascript repeat() 関数と同様の機能を提供します。すべてのブラウザで利用できるわけではありません。これは _。repeat と呼ばれ、バージョン3.0.0以降で利用可能です。

_.repeat('a', 10);
0
0x4a6f4672
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
Filth

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

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

私は @ bonbonの答え を拡張するつもりです。彼の方法は、誰かがそれをする必要がある場合に備えて、「既存の文字列に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
Bruno Bronosky