Então, minha pergunta foi feita por outra pessoa em seu formulário Java aqui: Java - Crie uma nova instância String com comprimento especificado e preenchido com caracteres específicos. Melhor solução?
. . . mas estou procurando pelo seu equivalente em JavaScript.
Basicamente, pretendo preencher dinamicamente os campos de texto com caracteres "#", com base no atributo "comprimento máximo" de cada campo. Portanto, se uma entrada tiver maxlength="3"
, o campo será preenchido com "###".
Idealmente, haveria algo como o Java StringUtils.repeat("#", 10);
, mas, até agora, a melhor opção em que posso pensar é percorrer e acrescentar os caracteres "#", um de cada vez, até que o comprimento máximo seja atingido. Não posso deixar de pensar que existe uma maneira mais eficiente de fazer isso do que isso.
Alguma ideia?
FYI - Não posso simplesmente definir um valor padrão na entrada, porque os caracteres "#" precisam ser claros no foco e, se o usuário não inseriu um valor, será necessário "reabastecer" no desfoque. É o passo de "reabastecimento" que me preocupa
fonte
Respostas:
A melhor maneira de fazer isso (que eu já vi) é
Isso cria uma matriz com o comprimento especificado e, em seguida, une-a à sequência especificada para repetir. A
.join()
função respeita o comprimento da matriz, independentemente de os elementos terem valores atribuídos e valores indefinidos serem renderizados como cadeias vazias.Você precisa adicionar 1 ao comprimento desejado porque a cadeia separadora fica entre os elementos da matriz.
fonte
parseInt()
o valor maxlength das entradas antes de usá-lo para dimensionar a matriz. É mesmo o que eu procurava . . . obrigado!repeat
função incorporada ao String.prototype lida com isso agora (ES6 +) #Faça uma tentativa: P
fonte
_.repeat('*',10);
repeat()
método. Ansioso pelo dia em que não preciso mais me preocupar com eles. . .Infelizmente, embora a abordagem Array.join mencionada aqui seja concisa, é cerca de 10 vezes mais lenta que uma implementação baseada em concatenação de cadeias. Ele executa especialmente mal em grandes seqüências de caracteres. Veja abaixo os detalhes completos de desempenho.
No Firefox, Chrome, Node.js.MOSOS, Node.js. Ubuntu e Safari, a implementação mais rápida que testei foi:
Isso é detalhado, portanto, se você quiser uma implementação concisa, poderá usar a abordagem ingênua; ele ainda executa entre 2 e 10 vezes melhor que a abordagem Array.join e também é mais rápido que a implementação duplicada para pequenas entradas. Código:
Outras informações:
fonte
Eu criaria uma string constante e depois chamaria a substring.
Algo como
Um pouco mais rápido também.
http://jsperf.com/const-vs-join
fonte
ES2015, a maneira mais fácil é fazer algo como
'X'.repeat(data.length)
X
sendo qualquer string,data.length
sendo o comprimento desejado.consulte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
fonte
Uma ótima opção do ES6 seria
padStart
uma string vazia. Como isso:Nota: isso não funcionará no IE (sem um polyfill).
fonte
s = '#'.repeat(10)
) da resposta de @ user4227915 acima?Versão que funciona em todos os navegadores
Esta função faz o que você deseja e executa muito mais rapidamente do que a opção sugerida na resposta aceita:
Você usa assim:
Para comparar o desempenho desta função com o da opção proposta na resposta aceita, consulte este Fiddle e este Fiddle para obter referências.
Versão apenas para navegadores modernos
Nos navegadores modernos, agora você também pode fazer isso:
Esta opção é ainda mais rápida. No entanto, infelizmente, ele não funciona em nenhuma versão do Internet Explorer.
Os números na tabela especificam a primeira versão do navegador que suporta totalmente o método:
fonte
Você também pode adicionar um polyfill para Repeat para navegadores mais antigos
fonte
Com base nas respostas de Hogan e Zero Trick Pony. Eu acho que isso deve ser rápido e flexível o suficiente para lidar bem com a maioria dos casos de uso:
fonte
Você pode usar a primeira linha da função como uma linha, se desejar:
fonte