860 Stimmen

Wiederholen Sie eine Zeichenfolge in JavaScript eine bestimmte Anzahl von Malen

In Perl kann ich ein Zeichen mehrmals wiederholen, indem ich die Syntax verwende:

$a = "a" x 10; // Ergebnis: "aaaaaaaaaa"

Gibt es eine einfache Möglichkeit, dies in Javascript zu erreichen? Ich kann offensichtlich eine Funktion verwenden, aber ich frage mich, ob es einen integrierten Ansatz oder eine andere clevere Technik gibt.

12voto

Der leistungsstärkste Weg ist https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

Kurzversion befindet sich 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;
  }
}

0 Stimmen

Das ist gut, aber das neue native "repeat" ist noch schneller und benötigt keine Implementierung, trotzdem danke!

1 Stimmen

Können Sie die Bedeutung von count >>>= 1, pattern += pattern; näher erläutern? Um was für eine Anweisung handelt es sich dabei?

0 Stimmen

Also ist dies ein Polyfill für das native Repeat, oder? Fügen Sie einfach ein if (!String.prototype.repeat) { am Anfang hinzu und } am Ende.

11voto

Nathan Danger Punkte 155

Wenn Sie nichts dagegen haben, eine Bibliothek in Ihr Projekt aufzunehmen, verfügt lodash über eine Repeat-Funktion.

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

https://lodash.com/docs#repeat

10voto

John Slegers Punkte 41127

Für alle Browser

Die folgende Funktion wird viel schneller ausgeführt als die im akzeptierten Antwortvorschlag vorgeschlagene Option:

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

Sie würde es so verwenden:

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

Um die Leistung dieser Funktion mit der des im akzeptierten Antwortvorschlag vorgeschlagenen Option zu vergleichen, siehe dieses Fiddle und dieses Fiddle für Benchmarks.

Nur für moderne Browser

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

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

Erfahren Sie mehr über diese Methode auf MDN.

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

enter image description here

8voto

Victor Stoddard Punkte 3337

String.repeat() wird von jetzt an von 96,39% der Browser unterstützt.

function pad(text, maxLength){ 
  return text + "0".repeat(maxLength - text.length);
}
console.log(pad('text', 7)); //text000

7voto

webdeb Punkte 12565

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

Fügen Sie dies einfach zu Ihren Projekten hinzu, und Sie sind bereit zu gehen.

  String.prototype.repeat = String.prototype.repeat || 
    function(n) {
      if (n < 0) throw new RangeError("ungültiger Zählwert");
      if (n == 0) return "";
      return new Array(n + 1).join(this.toString()) 
    };

0 Stimmen

SCRIPT5029: Die Array-Länge muss eine endliche positive Ganzzahl sein, wenn Sie diesen Ansatz versuchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X