webentwicklung-frage-antwort-db.com.de

Wiederhole das Zeichen N-mal

In Perl kann ich ein Zeichen mit der folgenden Syntax mehrmals wiederholen:

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

Gibt es eine einfache Möglichkeit, dies in Javascript zu erreichen? Natürlich kann ich eine Funktion verwenden, aber ich habe mich gefragt, ob es einen eingebauten Ansatz oder eine andere clevere Technik gibt.

557
Steve

Heutzutage wird die repeat-String-Methodefast ​​überall implementiert. (Es ist nicht in Internet Explorer .) Wenn Sie also ältere Browser nicht unterstützen müssen, können Sie einfach schreiben:

"a".repeat(10)

Vor repeat haben wir diesen Hack verwendet:

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

(Beachten Sie, dass ein Array der Länge 11 nur 10 "a" ergibt, da Array.join das Argument zwischen den Array-Elementen setzt.)

Simon weist auch darauf hin, dass es laut this jsperf in Safari und Chrome (aber nicht in Firefox) schneller zu sein scheint, ein Zeichen mehrere Male zu wiederholen, indem einfach eine for-Schleife angehängt wird (obwohl etwas weniger prägnant).

1124
Jason Orendorff

In einer neuen ES6-Harmonie können Sie dies auf native Weise mit Wiederholung tun. Auch ES6 ist derzeit nur experimentell, diese Funktion ist bereits verfügbar in Edge, FF, Chrome und Safari

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

Und sicher, wenn die Wiederholfunktion nicht verfügbar ist, können Sie old-good Array(n + 1).join("abc") verwenden.

295
Salvador Dali

Praktisch, wenn Sie sich oft wiederholen:

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

Die leistungsmäßigste Methode ist https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

Kurze Version ist unten.

  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));

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

Eine Alternative ist:

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

Wenn Sie mehrere Zeichen wiederholen müssen, multiplizieren Sie Ihre Bedingung:

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

HINWEIS: Sie müssen nicht wie bei Word = Array(11).join('a') um 1 überschießen

12
bonbon

Wenn Sie nicht dagegen sind, eine Bibliothek in Ihr Projekt aufzunehmen, hat lodash eine Wiederholungsfunktion.

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

https://lodash.com/docs#repeat

10
Nathan Danger

Für alle Browser

Die folgende Funktion ist viel schneller als die in der akzeptierten Antwort vorgeschlagene Option:

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

Du würdest es so benutzen:

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

Informationen zum Vergleich der Leistung dieser Funktion mit der in der akzeptierten Antwort vorgeschlagenen Option finden Sie unter this Fiddle and this Fiddle für Benchmarks.

Nur für moderne Browser

In modernen Browsern können Sie dies jetzt mit der String.prototype.repeat -Methode tun:

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

Weitere Informationen zu dieser Methode finden Sie unter MDN .

Diese Option ist noch schneller. Leider funktioniert es in keiner Version von Internet Explorer. Die Zahlen in der Tabelle geben die erste Browserversion an, die die Methode vollständig unterstützt:

enter image description here

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

Obwohl die am häufigsten gestellte Antwort etwas kompakter ist, müssen Sie bei diesem Ansatz kein zusätzliches Array-Element hinzufügen.

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

In ES2015/ES6 können Sie "*".repeat(n) verwenden.

Fügen Sie dies einfach zu Ihren Projekten hinzu, und Sie können loslegen.

  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

Eine andere interessante Möglichkeit, schnell n Zeichen zu wiederholen, besteht darin, die Idee des schnellen Exponentiationsalgorithmus zu verwenden:

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

Um einen Wert in meinen Projekten zu wiederholen, benutze ich repeat

Zum Beispiel:

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

seien Sie jedoch vorsichtig, da diese Methode der ECMAScript 6-Spezifikation hinzugefügt wurde.

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

repeatString(3,'x'); // => xxx
repeatString(10,'????'); // => "????????????????????????????????????????"
1
alejandro

Folgendes verwende ich:

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

In CoffeeScript:

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

Lodash bietet eine ähnliche Funktionalität wie die Javascript repeat () Funktion, die nicht in allen Browsern verfügbar ist. Es heißt _. Repeat und ist seit Version 3.0.0 verfügbar:

_.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

Kann auch als Einzeiler verwendet werden:

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

Ich werde auf @ Bonbon Antwort erweitern. Seine Methode ist eine einfache Möglichkeit, "N Zeichen an eine vorhandene Zeichenfolge anzuhängen", nur für den Fall, dass jemand dies tun muss. Zum Beispiel seit "google" ist eine 1 gefolgt von 100 Nullen .

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>

HINWEIS: Sie müssen die Länge der ursprünglichen Zeichenfolge zur Bedingung hinzufügen.

0
Bruno Bronosky