Wiederholen Sie das Zeichen N Mal

602

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? Ich kann natürlich eine Funktion verwenden, aber ich habe mich gefragt, ob es einen eingebauten Ansatz oder eine andere clevere Technik gibt.

Steve
quelle

Antworten:

1201

Heutzutage ist die repeatString-Methode fast überall implementiert . (Es befindet sich nicht in Internet Explorer .) Wenn Sie also keine älteren Browser unterstützen müssen, können Sie einfach schreiben:

"a".repeat(10)

Vorher repeathaben wir diesen Hack benutzt:

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

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

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

Jason Orendorff
quelle
4
Außerdem können Sie eine Variable anstelle einer festen Länge verwenden - Array (20-len), um beispielsweise eine Zeichenfolge auf 20 aufzufüllen.
John C
7
Die Schleifenmethode ist zwar schneller, aber ausführlicher. Außerdem bin ich verwirrt über all die positiven Stimmen für den ersten Kommentar, wenn man bedenkt, dass dies im Allgemeinen nützlich sein wird, wenn die Array-Länge variabel ist, z. B.Array(rawValue.length + 1).join("*")
Dexygen
Dies funktioniert im Fall 0 und 1 nicht, da sie identische Ergebnisse liefern.
Ryan
2
Die Formel lautet Array(n+1).join("a"). Wenn n = 0 ist, wird die leere Zeichenfolge zurückgegeben, und wenn n = 1, wird zurückgegeben "a". Ich denke, es funktioniert in allen Fällen.
Jason Orendorff
1
@Neel Das liegt daran, dass JS-Engines die Zeichenfolgenlänge begrenzen. In Chrome und Firefox liegt das Limit nahe bei 2 ^ 30 (ungefähr eine Milliarde). 10 ^ 12 ist eine Billion.
Jason Orendorff
301

In einer neuen ES6-Harmonie haben Sie eine native Möglichkeit, dies mit Wiederholung zu tun . Auch ES6 derzeit nur experimentell, diese Funktion ist bereits in Edge, FF, Chrome und Safari verfügbar

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

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

Salvador Dali
quelle
54

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

kennebec
quelle
53
Es ist eine schlechte Codierungspraxis, die Prototypen von Builtins zu verschmutzen.
Tuomassalo
3
@nurettin Weitere Informationen finden Sie unter programmers.stackexchange.com/questions/104320/… . Ich würde eine statische Hilfsfunktion mit dem richtigen Umfang und der Signatur von hinzufügen repeat(str, n).
Tuomassalo
4
Ich würde das n= n || 1Teil entfernen (oder prüfen, ob nes undefiniert ist), damit Sie auch die 0Zeiten wiederholen können .
Chodorowicz
3
Schauen Sie sich auch Mozillas offizielle Polyfill für ES6 an: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Eirik Birkeland
3
@ChrisV, String.repeatwurde nur in ES6 hinzugefügt, das erst im Juni 2015 abgeschlossen wurde. Ich denke, mein Punkt war gültig, als ich ihn 2012 schrieb. :)
Tuomassalo
13

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

Kurzversion 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;
  }
}
Konstantin Victorov
quelle
Dies ist eine gute, aber die neue native "Wiederholung" ist noch schneller und benötigt keine Implementierung, trotzdem danke!
Goty Metal
1
Können Sie die Bedeutung von count >>>= 1, pattern += pattern;näher erläutern ? Was ist das für eine Aussage?
Tsahi Asher
Das ist also eine Polyfüllung für die native Wiederholung? Fügen Sie einfach ein if (!String.prototype.repeat) {am Anfang und }am Ende hinzu.
trlkly
>>> = ist eine nicht signierte Rechtsverschiebungszuweisung (wie in count = count >>> 1) siehe: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user1441004
12

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 um 1 überschießenword = Array(11).join('a')

Bonbon
quelle
10

Wenn Sie nicht dagegen sind, eine Bibliothek in Ihr Projekt aufzunehmen, verfügt lodash über eine Wiederholungsfunktion.

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

https://lodash.com/docs#repeat

Nathan Gefahr
quelle
10

Für alle Browser

Die folgende Funktion wird viel schneller ausgeführt 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('');
}

Sie würden es so verwenden:

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

Um die Leistung dieser Funktion mit der der in der akzeptierten Antwort vorgeschlagenen Option zu vergleichen, finden Sie Benchmarks in dieser Geige und dieser Geige .

Nur für moderne Browser

In modernen Browsern können Sie dies jetzt mit folgender String.prototype.repeatMethode tun :

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

Lesen Sie mehr über diese Methode auf MDN .

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

Geben Sie hier die Bildbeschreibung ein

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

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

Grzegorz Pawlik
quelle
1
Leider wird die Füllmethode im IE nicht unterstützt, und wenn Sie nicht mit dem IE kompatibel sind, können Sie auch die Wiederholungsmethode verwenden.
Michiel
1
Warum sollten Sie die zusätzliche Methode verwenden, fill()wenn Sie das gleiche mit join("a")allein tun ...
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"
);
yckart
quelle
7

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

Fügen Sie dies einfach zu Ihren Projekten hinzu, und schon kann es losgehen.

  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()) 
    };
webdeb
quelle
SCRIPT5029: Array-Länge muss eine endliche positive ganze Zahl sein, wenn Sie versuchen, diesen Ansatz zu verwenden
andrepaulo
5

Eine andere interessante Möglichkeit, n Zeichen schnell zu wiederholen, besteht darin, die Idee eines 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;
};
csharpfolk
quelle
Warum sagst du "interessanter Weg"? was ist hier so interessant Es ist die offensichtliche Lösung, das grundlegendste Beispiel für ein Computerprogramm.
vsync
2

Um einen Wert in meinen Projekten zu wiederholen, verwende 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 zur ECMAScript 6-Spezifikation hinzugefügt wurde.

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

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

Folgendes benutze ich:

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

Ich werde die Antwort von @ bonbon 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, da "ein Google" eine 1 ist, 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 der Bedingung die Länge der ursprünglichen Zeichenfolge hinzufügen.

Bruno Bronosky
quelle
0

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

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

Kann auch als Einzeiler verwendet werden:

function repeat(str, len) {
    while (str.length < len) str += str.substr(0, len-str.length);
    return str;
}
Sarsaparille
quelle
Bei jedem Wettbewerb ist "für" schneller als "während". :-)
Juni
0

In CoffeeScript:

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

Auf diese Weise können Sie eine Funktion aufrufen und das Ergebnis mithilfe von Array () und join () abrufen.

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

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

Amir Dänisch
quelle
-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"
Caglayan ALTINCI
quelle
1
Dies überschreibt String.prototype.repeat, was in aktuellen Browsern nativ enthalten ist. Warum sollte man es auch minimieren? Sie müssen nicht alles in einer Zeile schreiben.
Blender
Keine Wiederholungsfunktion im IE, daher ist ein Prototyp erforderlich.
Caglayan ALTINCI
-3

Hier ist eine ES6-Version

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

Maxali
quelle