javascript - length - Repetir personaje N veces
repetir caracteres javascript (21)
En Perl puedo repetir un personaje varias veces usando la sintaxis:
$a = "a" x 10; // results in "aaaaaaaaaa"
¿Hay una forma sencilla de lograr esto en Javascript? Obviamente puedo usar una función, pero me preguntaba si había algún enfoque integrado, o alguna otra técnica inteligente.
Para todos los navegadores
La siguiente función se desempeñará mucho más rápido que la opción sugerida en la respuesta aceptada:
var repeat = function(str, count) {
var array = [];
for(var i = 0; i < count;)
array[i++] = str;
return array.join('''');
}
Lo usarías así:
var repeatedString = repeat("a", 10);
Para comparar el desempeño de esta función con el de la opción propuesta en la respuesta aceptada, consulte este violín y este violín para obtener puntos de referencia.
Sólo para navegadores modernos
En los navegadores modernos, ahora puede hacer esto utilizando el método String.prototype.repeat
:
var repeatedString = "a".repeat(10);
Lea más sobre este método en MDN .
Esta opción es aún más rápida. Desafortunadamente, no funciona en ninguna versión de Internet Explorer. Los números en la tabla especifican la primera versión del navegador que soporta totalmente este método:
Aquí hay una versión de ES6.
const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
repeat("A",20).forEach((a,b) => console.log(a,b+1))
Conveniente si te repitas mucho:
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) )
En CoffeeScript:
( ''a'' for dot in [0..10]).join('''')
En ES2015 / ES6 puede usar "*".repeat(n)
Así que solo agrega esto a tus proyectos, y estás listo para comenzar.
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())
};
En estos días, el método de cadena repeat
se implementa en casi todas partes. (No está en Internet Explorer ). Entonces, a menos que necesite admitir navegadores más antiguos, simplemente puede escribir:
"a".repeat(10)
Antes de repeat
, utilizamos este hack:
Array(11).join("a") // create string with 10 a''s: "aaaaaaaaaa"
(Tenga en cuenta que una matriz de longitud 11 le da solo 10 "a" s, ya que Array.join
coloca el argumento entre los elementos de la matriz).
Simon también señala que, según este jsperf , parece que es más rápido en Safari y Chrome (pero no en Firefox) repetir un carácter varias veces simplemente agregando el uso de un bucle for (aunque un poco menos conciso).
En una nueva armonía de ES6, tendrá una forma nativa de hacer esto con la repetición . También ES6 ahora solo experimental, esta característica ya está disponible en Edge, FF, Chrome y Safari
"abc".repeat(3) // "abcabcabc"
Y seguramente, si la función de repetición no está disponible, puede usar la Array(n + 1).join("abc")
antigua Array(n + 1).join("abc")
Esto es lo que yo uso:
function repeat(str, num) {
var holder = [];
for(var i=0; i<num; i++) {
holder.push(str);
}
return holder.join('''');
}
La forma más segura de obtener rendimiento es https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
La versión corta está abajo.
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;
}
}
Otra forma interesante de repetir rápidamente n caracteres es usar la idea del algoritmo de exponenciación rápida:
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;
};
Para repetir un valor en mis proyectos lo uso repetir
Por ejemplo:
var n = 6;
for (i = 0; i < n; i++) {
console.log("#".repeat(i+1))
}
pero tenga cuidado porque este método se ha agregado a la especificación ECMAScript 6.
Si no se opone a incluir una biblioteca en su proyecto, lodash tiene una función de repetición.
_.repeat(''*'', 3);
// → ''***
También se puede utilizar como una sola línea:
function repeat(str, len) {
while (str.length < len) str += str.substr(0, len-str.length);
return str;
}
Una alternativa es:
for(var word = ''''; word.length < 10; word += ''a''){}
Si necesita repetir varios caracteres, multiplique su condicional:
for(var word = ''''; word.length < 10 * 3; word += ''foo''){}
NOTA: No tiene que sobrepasar en 1 como con word = Array(11).join(''a'')
Voy a ampliar la respuesta de @Bbonbon . Su método es una forma fácil de "agregar N caracteres a una cadena existente", en caso de que alguien tenga que hacerlo. Por ejemplo, ya que "un google" es un 1 seguido de 100 ceros .
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>
NOTA: Tiene que agregar la longitud de la cadena original al condicional.
/**
* 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"
);
Array(10).fill(''a'').join('''')
Aunque la respuesta más votada es un poco más compacta, con este enfoque no tiene que agregar un elemento de matriz adicional.
String.prototype.repeat = function (n) { n = Math.abs(n) || 1; return Array(n + 1).join(this || ''''); };
// console.log("0".repeat(3) , "0".repeat(-3))
// return: "000" "000"
function repeatString(n, string) {
var repeat = [];
repeat.length = n + 1;
return repeat.join(string);
}
repeatString(3,''x''); // => xxx
repeatString(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);