275 votes

Chaîne de répétition - Javascript

Quelle est la méthode la plus efficace ou la plus concise pour renvoyer une chaîne de caractères répétée un nombre arbitraire de fois ?

Ce qui suit est mon meilleur essai jusqu'à présent :

function repeat(s, n){
    var a = [];
    while(a.length < n){
        a.push(s);
    }
    return a.join('');
}

5 votes

Il y a plus de 10 ans, j'ai trouvé une solution bien connue à ce problème, que j'ai utilisée comme exemple dans un article sur l'optimisation du JavaScript quelques mois avant que vous ne posiez cette question : webreference.com/programmation/javascript/jkm3/3.html Apparemment, la plupart des gens ont oublié ce code, et je ne vois pas de solution aussi bonne que la mienne. Le meilleur algorithme semble avoir été repris de mon code ; sauf qu'en raison d'une mauvaise compréhension du fonctionnement de mon code, il effectue une étape supplémentaire de concaténation exponentielle qui est éliminée dans mon code original par une boucle spéciale.

0 votes

Veuillez essayer cette comparaison et envisager de remplacer la réponse acceptée par la solution de longue date à ce problème, publiée avant même que cette question ne soit posée. jsperf.com/repeating-strings

11 votes

Personne n'a levé la solution de Joseph. L'algorithme a 3700 ans. Le coût de cette étape supplémentaire est négligeable. En outre, le coût de l'étape supplémentaire est négligeable. cet article contient des erreurs et des idées fausses concernant la concaténation de chaînes de caractères en Javascript. Pour toute personne intéressée par la manière dont Javascript gère réellement les chaînes de caractères en interne, voir Corde .

20voto

Orion Points 1020

String.prototype.repeat est désormais conforme à la norme ES6.

'abc'.repeat(3); //abcabcabc

19voto

U-D13 Points 329

Élargissement La solution de P.Bailey :

String.prototype.repeat = function(num) {
    return new Array(isNaN(num)? 1 : ++num).join(this);
    }

De cette manière, vous serez à l'abri des types d'arguments inattendus :

var foo = 'bar';
alert(foo.repeat(3));              // Will work, "barbarbar"
alert(foo.repeat('3'));            // Same as above
alert(foo.repeat(true));           // Same as foo.repeat(1)

alert(foo.repeat(0));              // This and all the following return an empty
alert(foo.repeat(false));          // string while not causing an exception
alert(foo.repeat(null));
alert(foo.repeat(undefined));
alert(foo.repeat({}));             // Object
alert(foo.repeat(function () {})); // Function

EDIT : Crédits à jerone pour son élégance ++num idée !

3 votes

J'ai un peu modifié la vôtre : String.prototype.repeat = function(n){return new Array(isNaN(n) ? 1 : ++n).join(this);}

1 votes

Quoi qu'il en soit, selon ce test ( jsperf.com/string-repeat/2 ) en faisant une simple boucle for avec concaténation de chaîne semble être beaucoup plus rapide sur Chrome qu'en utilisant Array.join. N'est-ce pas amusant ?

9voto

Kalpesh Patel Points 2244

Utilisation Array(N+1).join("string_to_repeat")

5voto

BitOfUniverse Points 2516
/**  
@desc: repeat string  
@param: n - times  
@param: d - delimiter  
*/

String.prototype.repeat = function (n, d) {
    return --n ? this + (d || '') + this.repeat(n, d) : '' + this
};

Voici comment répéter plusieurs fois une chaîne de caractères à l'aide d'un ébrancheur.

5voto

Dennis Points 11

Voici une amélioration de 5 à 7 % par rapport à la réponse de disfated.

Dérouler la boucle en s'arrêtant à count > 1 et effectuer un result += pattnern concat après la boucle. Cela permet d'éviter que les boucles finissent par être inutilisées. pattern += pattern sans avoir à utiliser un contrôle if coûteux. Le résultat final ressemblerait à ceci :

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;
    }
    result += pattern;
    return result;
};

Et voici le fiddle de disfated pour la version déroulée : http://jsfiddle.net/wsdfg/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X