Repetă un șir în JavaScript de un număr de ori


În Perl pot repeta un caracter de mai multe ori folosind sintaxa:

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

Există o modalitate simplă de a realiza acest lucru în Javascript? Evident, pot folosi o funcție, dar mă întrebam dacă există vreo metodă încorporată sau vreo altă tehnică ingenioasă.

Răspuns #1

În zilele noastre, metoda de șir repeat este implementată aproape peste tot. (Nu este în Internet Explorer.) Deci, dacă nu trebuie să sprijiniți browserele mai vechi, puteți pur și simplu să scrieți:

"a".repeat(10)

Înainte de repeat, foloseam acest truc:

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

(Rețineți că un array de lungime 11 vă oferă doar 10 „a”, deoarece Array.join pune argumentul între elementele array-ului.)

Simon subliniază, de asemenea, că potrivit acestui reper, se pare că este mai rapid în Safari și Chrome (dar nu și în Firefox) să repeți un caracter de mai multe ori pur și simplu adăugându-l folosind un ciclu for (deși puțin mai puțin concis).

Răspunsul #2

În un nou ES6 harmony, veți avea o modalitate nativă de a face acest lucru cu repeat. De asemenea, ES6 este momentan doar experimental, această funcție este deja disponibilă în Edge, FF, Chrome și Safari

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

Și cu siguranță dacă funcția repeat nu este disponibilă, poți folosi vechiul și bunul Array(n + 1).join("abc")

Răspunsul #3

Convenabil dacă te repeți mult:

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

Răspunsul #4

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

Deși răspunsul cel mai votat este puțin mai compact, cu această abordare nu trebuie să adaugi un element suplimentar în array.

Răspunsul #5

O alternativă este:

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

Dacă trebuie să repeți mai multe caractere, înmulțește condiția ta:

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

NOTĂ: Nu trebuie să depășiți cu 1 ca în word=Array(11).join('a')

Răspunsul #6

Cea mai eficientă metodă din punct de vedere al performanței este https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

Versiunea scurtă este mai jos.

  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 de la 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;
  }
}

Răspunsul #7

Dacă nu ești împotriva includerii unei biblioteci în proiectul tău, lodash are o funcție repeat.

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

https://lodash.com/docs#repeat

Răspunsul #8

Pentru toate browserele

Funcția următoare va rula mult mai rapid decât opțiunea sugerată în răspunsul acceptat:

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

Ai folosi-o astfel :

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

Pentru a compara performanța acestei funcții cu cea a opțiunii propuse în răspunsul acceptat, vezi acest Fiddle și acest Fiddle pentru teste de referință.

Doar pentru browserele moderne

În browserele moderne, acum poți face acest lucru folosind metoda String.prototype.repeat:

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

Citește mai multe despre această metodă pe MDN.

Această opțiune este și mai rapidă. Din păcate, nu funcționează în nicio versiune de Internet Explorer. Numerele din tabel specifică prima versiune de browser care suportă complet metoda:

Răspunsul #9

String.repeat() este suportat de 96,39% dintre browsere în prezent.

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