Donc, ma question a été posée par quelqu'un d'autre sous sa forme Java ici: Java - Créer une nouvelle instance String avec une longueur spécifiée et remplie d'un caractère spécifique. Meilleure solution?
. . . mais je cherche son équivalent JavaScript.
Fondamentalement, je souhaite remplir dynamiquement les champs de texte avec des caractères "#", en fonction de l'attribut "maxlength" de chaque champ. Donc, si une entrée a maxlength="3"
, alors le champ sera rempli avec "###".
Idéalement, il y aurait quelque chose comme Java StringUtils.repeat("#", 10);
, mais, jusqu'à présent, la meilleure option à laquelle je puisse penser est de boucler et d'ajouter les caractères "#", un à la fois, jusqu'à ce que la longueur maximale soit atteinte. Je ne peux pas me débarrasser du sentiment qu'il existe un moyen plus efficace de le faire que cela.
Des idées?
FYI - Je ne peux pas simplement définir une valeur par défaut dans l'entrée, car les caractères "#" doivent être effacés lors de la mise au point et, si l'utilisateur n'a pas entré de valeur, ils devront être "remplis" sur le flou. C'est l'étape de "recharge" qui me préoccupe
la source
Réponses:
La meilleure façon de faire cela (que j'ai vue) est
Cela crée un tableau avec la longueur donnée, puis le joint à la chaîne donnée à répéter. La
.join()
fonction honore la longueur du tableau indépendamment du fait que les éléments aient ou non des valeurs assignées, et les valeurs non définies sont rendues sous forme de chaînes vides.Vous devez ajouter 1 à la longueur souhaitée car la chaîne de séparation passe entre les éléments du tableau.
la source
parseInt()
la valeur maxlength des entrées avant de l'utiliser pour dimensionner le tableau. Exactement ce que je cherchais . . . Merci!repeat
fonction intégrée à String.prototype gère cela maintenant (ES6 +)Essayez ceci: P
la source
_.repeat('*',10);
repeat()
méthode. Dans l'attente du jour où je n'aurai plus à me soucier d'eux, moi-même. . .Malheureusement, bien que l'approche Array.join mentionnée ici soit laconique, elle est environ 10 fois plus lente qu'une implémentation basée sur la concaténation de chaînes. Il fonctionne particulièrement mal sur les grosses cordes. Voir ci-dessous pour plus de détails sur les performances.
Sur Firefox, Chrome, Node.js MacOS, Node.js Ubuntu et Safari, l'implémentation la plus rapide que j'ai testée était:
C'est verbeux, donc si vous voulez une implémentation laconique, vous pouvez opter pour l'approche naïve; il fonctionne toujours entre 2X et 10X mieux que l'approche Array.join, et est également plus rapide que l'implémentation du doublement pour les petites entrées. Code:
Informations complémentaires:
la source
Je créerais une chaîne constante, puis j'appellerais une sous-chaîne dessus.
Quelque chose comme
Un peu plus vite aussi.
http://jsperf.com/const-vs-join
la source
ES2015, le moyen le plus simple est de faire quelque chose comme
'X'.repeat(data.length)
X
étant n'importe quelle chaîne,data.length
étant la longueur désirée.voir: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat
la source
Une excellente option ES6 serait d'utiliser
padStart
une chaîne vide. Comme ça:Remarque: cela ne fonctionnera pas dans IE (sans polyfill).
la source
s = '#'.repeat(10)
) de la réponse de @ user4227915 ci - dessus?Version qui fonctionne dans tous les navigateurs
Cette fonction fait ce que vous voulez et fonctionne beaucoup plus rapidement que l'option suggérée dans la réponse acceptée:
Vous l'utilisez comme ceci:
Pour comparer les performances de cette fonction avec celles de l'option proposée dans la réponse acceptée, voir ce Fiddle et ce Fiddle pour les repères.
Version pour les navigateurs modernes uniquement
Dans les navigateurs modernes, vous pouvez désormais également faire ceci:
Cette option est encore plus rapide. Cependant, malheureusement, cela ne fonctionne dans aucune version d'Internet Explorer.
Les chiffres du tableau indiquent la première version du navigateur qui prend entièrement en charge la méthode:
la source
Vous pouvez également ajouter un polyfill pour Repeat pour les anciens navigateurs
la source
Basé sur les réponses de Hogan et Zero Trick Pony. Je pense que cela devrait être à la fois suffisamment rapide et flexible pour bien gérer la plupart des cas d'utilisation:
la source
Vous pouvez utiliser la première ligne de la fonction comme une seule ligne si vous le souhaitez:
la source