212 votes

Créez une chaîne de longueur variable, remplie d'un caractère répété

Donc, ma question a été posée par quelqu'un d'autre dans sa forme Java ici: Java - Créer une nouvelle instance de chaîne avec une longueur spécifiée et remplie d'un caractère spécifique. Meilleure solution?

. . . mais je cherche son équivalent en JavaScript.

En gros, je veux remplir dynamiquement les champs de texte avec des caractères "#", en fonction de l'attribut "maxlength" de chaque champ. Ainsi, si un champ a maxlength="3", alors le champ serait rempli avec "###".

Idéalement, il y aurait quelque chose comme le StringUtils.repeat("#", 10); Java, mais, jusqu'à présent, la meilleure option à laquelle je peux penser est de boucler et d'ajouter les caractères "#" un par un jusqu'à ce que la longueur maximale soit atteinte. Je ne peux pas m'empêcher de penser qu'il existe un moyen plus efficace de le faire que cela.

Des idées?

À noter - Je ne peux pas simplement définir une valeur par défaut dans l'entrée, car les caractères "#" doivent être effacés au focus, et, si l'utilisateur n'a pas saisi de valeur, ils doivent être "remplis" à la perte de focus. C'est l'étape de "remplissage" qui me préoccupe

1 votes

Est-ce que vous faites cela pour masquer le texte d'un champ de saisie ?

0 votes

@MatthewCox: Non, c'est plus pour fournir un affichage visuel de maxlength. Dans ce cas, il s'agit d'un ensemble de champs de numéro de téléphone qui sont séparés en 3 parties du numéro. Cela montrerait que les 2 premiers champs nécessitent 3 chiffres et le dernier en nécessite 4.

0 votes

Possible duplicate de Répéter String - Javascript

361voto

Pointy Points 172438

La meilleure façon de faire cela (que j'ai vue) est

var str = new Array(len + 1).join( character );

Cela crée un tableau de la longueur donnée, puis le joint avec la chaîne donnée pour la répéter. La fonction .join() prend en compte la longueur du tableau indépendamment que les éléments aient des valeurs assignées, et les valeurs non définies sont rendues comme des chaînes vides.

Vous devez ajouter 1 à la longueur désirée car la chaîne de séparation va entre les éléments du tableau.

0 votes

Bien joué. :) Il me suffisait de me rappeler d'utiliser parseInt() sur la valeur maxlength des entrées avant de l'utiliser pour dimensionner le tableau. Exactement ce que je cherchais . . . merci!

12 votes

Note, cette solution est TRÈS lente. Elle a l'air sexy mais c'est probablement exactement la mauvaise façon de le faire.

39 votes

La nouvelle fonction répéter intégrée dans String.prototype gère cela maintenant (ES6+)

267voto

Essayez ceci :P

s = '#'.repeat(10)

document.body.innerHTML = s

5 votes

Certainement la mise en œuvre la plus facile, mais aussi la moins prise en charge, car elle fait partie d'ECMAScript 6. Il semble que, pour le moment, elle n'est prise en charge que dans Firefox, Chrome et la version de bureau de Safari.

6 votes

Si cela ne vous dérange pas d'utiliser lodash, vous pourriez utiliser ce qui suit : _.repeat('*',10);

8 votes

C'est maintenant 2018 et ES6 est bien établi - cela devrait être la réponse acceptée. Et en cas de besoin de prise en charge des anciens navigateurs pour ceux qui n'utilisent pas Babel ou quelque chose de similaire, vous pouvez utiliser lodash comme mentionné ci-dessus, ou un polyfill en guise de secours.

47voto

Weeks Points 95

ES2015 la manière la plus simple 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

0 votes

Meilleure réponse pour toute personne lisant ceci aujourd'hui.

31voto

Zero Trick Pony Points 156

Malheureusement, bien que l'approche Array.join mentionnée ici soit concise, elle est environ 10 fois plus lente qu'une implémentation basée sur la concaténation de chaînes. Elle fonctionne particulièrement mal sur de grandes chaînes. 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 la suivante :

function repeatChar(count, ch) {
    if (count == 0) {
        return "";
    }
    var count2 = count / 2;
    var result = ch;

    // doubler l'entrée jusqu'à ce qu'elle soit assez longue.
    while (result.length <= count2) {
        result += result;
    }
    // utiliser la méthode substring pour atteindre la longueur précise cible sans utiliser de mémoire supplémentaire
    return result + result.substring(0, count - result.length);
};

Ceci est verbeux, donc si vous voulez une implémentation concise, vous pourriez opter pour l'approche naive ; elle fonctionne toujours entre 2 et 10 fois mieux que l'approche Array.join, et est également plus rapide que l'implémentation en doublant pour de petites entrées. Code :

// approche naive : simplement ajouter les lettres une par une
function repeatChar(count, ch) {
    var txt = "";
    for (var i = 0; i < count; i++) {
        txt += ch;
    }
    return txt;
}

Informations supplémentaires :

1 votes

C'est encore BEAUCOUP plus lent (de 2 à 3 ordres de grandeur) que ma solution.

0 votes

@Hogan Votre solution ne crée pas une chaîne remplie à partir de nulle part. Vous la créez vous-même puis extrayez simplement une sous-chaîne.

0 votes

Cette approche est 10x plus lente que Array.join dans Node.js pour les chaînes extrêmement grandes.

24voto

Hogan Points 30189

Je créerais une chaîne constante et ensuite j'appellerais substring dessus.

Quelque chose comme

var hashStore = '########################################';

var Fiveup = hashStore.substring(0,5);

var Tenup = hashStore.substring(0,10);

Un peu plus rapide aussi.

http://jsperf.com/const-vs-join

1 votes

C'est très intelligent! Et cela fonctionne même avec des modèles de chaînes contenant plusieurs caractères.

1 votes

Juste revisiter cette page car elle semble attirer beaucoup d'attention et je voulais commenter votre solution. Bien que j'apprécie certainement la simplicité et la rapidité de votre approche, mon plus grand souci était la maintenance/la réutilisation. Alors que dans mon scénario spécifique, je n'avais pas besoin de plus de 4 caractères, en tant que fonction générique, l'utilisation d'une chaîne de longueur fixe signifie que vous devez revenir et mettre à jour la chaîne, si votre cas d'utilisation nécessite plus de caractères. Les deux autres solutions offrent une plus grande flexibilité à cet égard. +1 pour la rapidité, cependant.

1 votes

Oh, et, d'un autre côté (et je réalise que cela relève davantage d'une préoccupation stylistique que d'une préoccupation programmatique), le maintien d'une chaîne de caractères de 30+ caractères qui ne sera jamais utilisée que pour 3-4 caractères ne me convenait pas non plus . . . encore une fois, un problème mineur autour de la flexibilité de la solution pour divers cas d'utilisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X