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.
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).
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")
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) )
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;
}
}
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')
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);
// → '***
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.
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:
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.
/**
* 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"
);
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())
};
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;
};
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.
function repeatString(n, string) {
var repeat = [];
repeat.length = n + 1;
return repeat.join(string);
}
repeatString(3,'x'); // => xxx
repeatString(10,'????'); // => "????????????????????????????????????????"
Voici ce que j'utilise:
function repeat(str, num) {
var holder = [];
for(var i=0; i<num; i++) {
holder.Push(str);
}
return holder.join('');
}
Dans CoffeeScript:
( 'a' for dot in [0..10]).join('')
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);
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);
Peut aussi être utilisé comme one-liner:
function repeat(str, len) {
while (str.length < len) str += str.substr(0, len-str.length);
return str;
}
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.