web-dev-qa-db-fra.com

Répéter le caractère N fois

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

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

Existe-t-il un moyen simple de réaliser 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.

557
Steve

De nos jours, la méthode repeat string est implémentée presque partout. (C'est pas dans Internet Explorer .) Donc, à moins que vous n'ayez besoin de supporter des navigateurs plus anciens, 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 ne vous donne que 10 "a", puisque Array.join place l'argument entre les éléments du tableau.)

Simon souligne également que, selon this jsperf , il semble que Safari soit plus rapide et que Chrome (mais pas Firefox) répète un caractère plusieurs fois en ajoutant simplement à l'aide d'une boucle for (bien qu'un peu moins concis).

1124
Jason Orendorff

Dans une nouvelle harmonie ES6, vous aurez le moyen de le faire avec répétez . Aussi ES6 actuellement seulement expérimentale, cette fonctionnalité est déjà disponible dans Edge, FF, Chrome et Safari

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

Et si la fonction de répétition n’est pas disponible, vous pouvez utiliser old-good Array(n + 1).join("abc")

295
Salvador Dali

Pratique si vous vous répétez beaucoup:

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

La méthode la plus performante 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

Une alternative est:

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

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

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

NOTE: Vous ne devez pas dépasser de 1 comme avec Word = Array(11).join('a')

12
bonbon

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
Nathan Danger

Pour tous les navigateurs

La fonction suivante fonctionnera beaucoup plus rapidement que l'option suggéré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 les performances de cette fonction avec celles de l'option proposée dans la réponse acceptée, voir this Fiddle et ce violon pour les points de repère.

Pour les navigateurs modernes seulement

Dans les navigateurs modernes, vous pouvez maintenant utiliser la méthode String.prototype.repeat:

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 complètement la méthode:

enter image description here

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

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

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

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

Une autre façon intéressante de rapidement répéter n caractère consiste à utiliser l'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;
};
5
csharpfolk

Je répète une valeur dans mes projets

Par exemple:

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

mais soyez prudent car cette méthode a été ajoutée à la spécification ECMAScript 6.

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

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

Voici ce que j'utilise:

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

Dans CoffeeScript:

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

Lodash offre une fonctionnalité similaire à la fonction Javascript repeat () qui n'est pas disponible dans tous les moteurs. Il s’appelle _. Repeat et disponible depuis la version 3.0.0:

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

Peut aussi être utilisé comme one-liner:

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

Je vais développer réponse de @ bonbon . Sa méthode est un moyen facile "d'ajouter N caractères à une chaîne existante", juste au cas où quelqu'un aurait besoin de le faire. Par exemple depuis "un google" est un 1 suivi de 100 zéros .

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>

REMARQUE: Vous devez ajouter la longueur de la chaîne d'origine au conditionnel.

0
Bruno Bronosky