Entonces, mi pregunta ha sido formulada por otra persona en su forma de Java aquí: Java: crea una nueva instancia de String con una longitud especificada y llena con un carácter específico. ¿Mejor solución?
. . . pero estoy buscando su equivalente de JavaScript.
Básicamente, quiero llenar dinámicamente los campos de texto con caracteres "#", según el atributo "maxlength" de cada campo. Entonces, si una entrada tiene maxlength="3"
, el campo se rellenará con "###".
Idealmente, habría algo como el Java StringUtils.repeat("#", 10);
, pero, hasta ahora, la mejor opción que se me ocurre es recorrer y agregar los caracteres "#", uno a la vez, hasta alcanzar la longitud máxima. No puedo evitar la sensación de que hay una manera más eficiente de hacerlo que eso.
¿Algunas ideas?
FYI: no puedo simplemente establecer un valor predeterminado en la entrada, porque los caracteres "#" deben borrarse al enfocar y, si el usuario no ingresó un valor, deberán "rellenarse" en el desenfoque. Es el paso de "recarga" que me preocupa
fuente
Respuestas:
La mejor manera de hacer esto (que he visto) es
Eso crea una matriz con la longitud dada, y luego la une con la cadena dada para repetir. La
.join()
función respeta la longitud de la matriz independientemente de si los elementos tienen valores asignados y los valores indefinidos se representan como cadenas vacías.Debe agregar 1 a la longitud deseada porque la cadena de separación va entre los elementos de la matriz.
fuente
parseInt()
el valor de longitud máxima de las entradas antes de usarlo para dimensionar la matriz. Justo lo que estaba buscando . . . ¡Gracias!repeat
función integrada en String.prototype maneja esto ahora (ES6 +)Prueba esto: P
fuente
_.repeat('*',10);
repeat()
método. Estoy deseando que llegue el día en que ya no tenga que preocuparme por ellos. . .Desafortunadamente, aunque el enfoque Array.join mencionado aquí es conciso, es aproximadamente 10 veces más lento que una implementación basada en concatenación de cadenas. Se desempeña especialmente mal en cuerdas grandes. Vea a continuación los detalles completos del rendimiento.
En Firefox, Chrome, Node.js MacOS, Node.js Ubuntu y Safari, la implementación más rápida que probé fue:
Esto es detallado, por lo que si desea una implementación concisa podría optar por el enfoque ingenuo; todavía funciona entre 2X y 10X mejor que el enfoque Array.join, y también es más rápido que la implementación de duplicación para entradas pequeñas. Código:
Más información:
fuente
Crearía una cadena constante y luego llamaría a la subcadena.
Algo como
Un poco más rápido también.
http://jsperf.com/const-vs-join
fuente
ES2015 la forma más fácil es hacer algo como
'X'.repeat(data.length)
X
siendo cualquier cadena,data.length
siendo la longitud deseada.ver: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
fuente
Una gran opción de ES6 sería
padStart
una cadena vacía. Me gusta esto:Nota: esto no funcionará en IE (sin un polyfill).
fuente
s = '#'.repeat(10)
) de la respuesta de @ user4227915 anterior?Versión que funciona en todos los navegadores.
Esta función hace lo que desea y funciona mucho más rápido que la opción sugerida en la respuesta aceptada:
Lo usas así:
Para comparar el rendimiento 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.
Versión solo para navegadores modernos
En los navegadores modernos, ahora también puede hacer esto:
Esta opción es aún más rápida. Sin embargo, 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 :
fuente
También puede agregar un polyfill para Repeat para navegadores antiguos
fuente
Basado en las respuestas de Hogan y Zero Trick Pony. Creo que esto debería ser lo suficientemente rápido y flexible como para manejar bien la mayoría de los casos de uso:
fuente
Puede usar la primera línea de la función como una línea si desea:
fuente