Question Répéter le caractère N fois


En Perl, je peux répéter un caractère plusieurs fois en utilisant la syntaxe:

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

Existe-t-il un moyen simple d'accomplir cela en Javascript? Je peux évidemment utiliser une fonction, mais je me demandais s'il y avait une approche intégrée, ou une autre technique intelligente.


491
2017-12-09 22:48


origine


Réponses:


Ces jours-ci, le repeat méthode de chaîne est implémenté presque partout. (C'est pas dans Internet Explorer.) Donc, à moins que vous ayez besoin de prendre en charge d'anciens navigateurs, vous pouvez simplement écrire:

"a".repeat(10)

Avant repeat, nous avons utilisé ce hack:

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

(Notez qu'un tableau de longueur 11 vous obtient seulement 10 "a" s, depuis Array.join met l'argument entre les éléments du tableau.)

Simon souligne également que selon ce jsperf, il semble que Safari et Chrome soient plus rapides (mais pas Firefox) pour répéter un personnage plusieurs fois en ajoutant simplement une boucle for (bien qu'un peu moins concise).


1003
2017-12-09 22:49



Dans une nouvelle harmonie ES6, vous aurez un moyen natif de le faire avec répéter. Aussi ES6 maintenant seulement expérimental, cette fonctionnalité est Déjà disponible dans Edge, FF, Chrome et Safari

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

Et sûrement si la fonction de répétition n'est pas disponible, vous pouvez utiliser le bon vieux Array(n + 1).join("abc")


291
2018-05-02 21:16



Pratique si vous vous répétez beaucoup:

String.prototype.repeat= function(n){
    n= n || 1;
    return Array(n+1).join(this);
}


alert('Are we there yet?\nNo.\n'.repeat(10))

49
2017-12-10 02:50



Le moyen le plus performant est https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

La version courte est ci-dessous.

  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 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
2017-10-27 13:05



Une alternative est:

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

Si vous devez répéter plusieurs caractères, multipliez votre condition:

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

REMARQUE: Vous ne devez pas dépasser par 1 comme avec word = Array(11).join('a')


11
2017-08-21 13:55



Si vous n'êtes pas opposé à l'inclusion d'une bibliothèque dans votre projet, lodash a une fonction de répétition.

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

https://lodash.com/docs#repeat


10
2017-09-08 21:22



Pour tous les navigateurs

La fonction suivante fonctionnera beaucoup plus rapidement que l'option proposée dans la réponse acceptée:

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

Vous l'utiliseriez comme ceci:

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

Pour comparer la performance de cette fonction avec celle de l'option proposée dans la réponse acceptée, voir ce violon et ce violon pour les benchmarks.

Pour les navigateurs modernes uniquement

Dans les navigateurs modernes, vous pouvez maintenant le faire en utilisant String.prototype.repeat méthode:

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

En savoir plus sur cette méthode sur MDN.

Cette option est encore plus rapide. Malheureusement, cela ne fonctionne dans aucune version d'Internet Explorer. Les nombres dans la table spécifient la première version du navigateur qui supporte entièrement la méthode:

enter image description here


9
2018-02-25 18:23



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

Bien que la réponse la plus votée soit un peu plus compacte, avec cette approche, vous n'avez pas besoin d'ajouter un élément de tableau supplémentaire.


9
2017-08-16 15:41



Dans ES2015 / ES6, vous pouvez utiliser "*".repeat(n) 

Il suffit donc d'ajouter ceci à vos projets, et vous êtes prêt à partir.

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

8
2018-03-16 21:01



Une autre façon intéressante de rapidement repeat n character est d'utiliser une idée de l'algorithme d'exponentiation rapide:

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

6
2018-01-06 12:17



/**  
 * 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"
);

5
2018-05-09 02:29