Pregunta

En Perl que puede repetir varias veces un personaje utilizando la sintaxis:

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

¿Hay una manera sencilla de lograr esto en Javascript? Yo, obviamente, puede utilizar una función, pero me preguntaba si había alguna construyeron en el enfoque, o alguna otra técnica inteligente.

¿Fue útil?

Solución

En estos días, la href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat" rel="noreferrer"> repeat método de cadena se implementa casi en todas partes. (Es no está en Internet Explorer ) Así que a menos que necesita para apoyar los navegadores antiguos, simplemente hay que escribir:

"a".repeat(10)

Antes de repeat, hemos utilizado este truco:

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

(Tenga en cuenta que una matriz de longitud 11 que recibe sólo 10 "a" s, ya que Array.join pone el argumento entre los elementos de la matriz.)

Simon también señala que de acuerdo con la este jsperf , parece que es más rápido en Safari y Chrome ( pero no Firefox) para repetir un carácter varias veces simplemente añadiendo utilizando un bucle (aunque un poco menos concisa).

Otros consejos

En una nueva armonía ES6, tendrá forma nativa para hacer esto con repetir . También ES6 ahora solamente experimental, esta característica es ya disponible en Edge, FF, Chrome y Safari

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

Y seguramente, si la función de repetición no está disponible, puede utilizar la vieja buena Array(n + 1).join("abc")

conveniente si se repite a sí mismo una gran cantidad:

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 mayoría de la manera rendimiento wice es https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

Versión reducida está por debajo.

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

Una alternativa es:

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

Si es necesario repetir múltiples caracteres, multiplique su condicional:

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

Nota: no tiene que sobrepasar por 1 como con word = Array(11).join('a')

Si no está opuesto a la inclusión de una biblioteca en su proyecto, lodash tiene una función de repetición.

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

https://lodash.com/docs#repeat

Para todos los navegadores

La siguiente función llevará a cabo 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('');
}

Se podría utilizar de esta manera:

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

Para comparar el desempeño de esta función con la de la opción propuesta en la respuesta aceptada, consulte este violín y href="https://jsfiddle.net/mf2jwjym/4/" rel="nofollow noreferrer"> esta violín para puntos de referencia.

Para moderns navegadores sólo

En los navegadores modernos, ahora se puede hacer este método String.prototype.repeat usando:

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

Más información sobre este método en MDN .

Esta opción es aún más rápido. Por desgracia, no funciona en cualquier versión de Internet Explorer. Los números de la tabla especifican la primera versión del navegador que es totalmente compatible con el método:

introducir descripción de la imagen aquí

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

A pesar de que la respuesta más votada es un poco más compacto, con este enfoque no tiene que agregar un elemento de la matriz extra.

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

En ES2015 / ES6 puede utilizar "*".repeat(n)

Así que sólo tiene que añadir esto a sus proyectos, y su son buenos para ir.

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

Otra forma interesante de rápido repetición de n caracteres es utilizar 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 obtener un valor de repetición en mis proyectos i uso repetido

Por ejemplo:

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

pero tenga cuidado ya que este método ha sido añadido a la especificación ECMAScript 6.

Esto es lo que utilizo:

function repeat(str, num) {
        var holder = [];
        for(var i=0; i<num; i++) {
            holder.push(str);
        }
        return holder.join('');
    }
function repeatString(n, string) {
  var repeat = [];
  repeat.length = n + 1;
  return repeat.join(string);
}

repeatString(3,'x'); // => xxx
repeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹"

Voy a ampliar @ bombón de respuesta . Su método es una manera fácil de "añadir N caracteres de una cadena existente", por si acaso alguien necesita hacer eso. Por ejemplo desde "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:. Usted tiene que añadir la longitud de la cadena original para el condicional

Lodash ofrece una funcionalidad similar a la Javascript repetición () función que no está disponible en todos los navegadores. Se llama _.repeat y disponible desde la versión 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);

Puede ser utilizado como una sola línea también:

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

En CoffeeScript:

( 'a' for dot in [0..10]).join('')
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"

Esta es una versión ES6

const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
repeat("A",20).forEach((a,b) => console.log(a,b+1))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top