J'ai une chaîne comme indiqué dans mon code. Je veux supprimer 80% des lettres de chaîne et les remplacer par "_" (trait de soulignement).
J'ai réussi à remplacer tous les caractères de chaîne par "_" mais je ne peux pas le faire remplacer seulement 80% de ma chaîne.
var a = "mystring";
var splitted = a.split('');
var count = 0;
while(count < a.length) {
if(splitted[count] !== '_' && splitted[count] !== ' ') {
splitted[count] = '_ ';
count++;
}
}
console.log(splitted);
Sortie de code: _ _ _ _ _ _ _ _
Sortie souhaitée: _ y _ _ _ _ _ _
ou: _ _ s _ _ _ _ _
ou: _ _ _ _ _ _ i _
6 Réponses :
C'est la solution simple la plus proche que je puisse trouver. Il masquera les lettres avec une certaine probabilité. Disons que vous voulez masquer les lettres avec "80% de probabilité", alors c'est fait comme ça. Bien sûr, il ne masquera pas 80% des lettres à chaque fois:
const hideLetters = (str = '', probability = 1, mask = '_') => {
return str
.split('')
.map((letter, i) => (Math.random() >= probability) ? letter : mask)
.join('');
}
console.log(hideLetters('mystring', 0.8));
console.log(hideLetters('password', 0.5, '*'));
vous pouvez combiner le modèle str.split (''). map (cb) à Array.from (str, cb)) , car les chaînes sont étalées en raison de l'implémentation Symbol.iterator .
Si vous voulez être sûr qu'il remplace 80% des caractères, vous pouvez d'abord construire un tableau (mieux encore, un Set () ) de positions aléatoires et non répétées à remplacer, avec 80% des taille de la chaîne, puis utilisez-la pour effectuer les remplacements. Ou peut-être d'abord construire un tableau de positions séquentielles, supprimer 20% d'entre elles, puis l'utiliser pour savoir quelles positions remplacer sur la chaîne.
Vous pouvez remplacer un seul caractère en vérifiant une valeur aléatoire.
var string = "mystring",
replaced = string.replace(/./g, c => Math.random() < 0.8 ? '_' : c);
console.log(replaced);
Cette approche donne à tout caractère une probabilité de 80% d'être remplacé, ce qui pourrait entraîner le remplacement de tous les caractères ou, avec une très faible probabilité, aucun caractère remplacé. C'est une approche élégante, mais je pense que l'OP veut que les 80% des caractères soient remplacés et laisse le reste sans changement
Vous pouvez d'abord remplacer toutes les lettres, puis calculer le nombre de lettres pour revenir à l'original.
function replace(string, percent) {
let re = string.replace(/\S/g, '_').split('')
let len = string.replace(/ /g, '').length
let count = len - Math.ceil(len * percent)
while (count) {
let int = Math.floor(Math.random() * string.length)
if (re[int] != ' ' && re[int] == '_') {
re[int] = string[int]
count--
}
}
return re.join('')
}
console.log(replace("mystring lorem", 0.8))
console.log(replace("mystring", 0.8))
console.log(replace("Lorem ipsum dolor sit amet.", 0.2))
Si vous voulez remplacer 80% de votre chaîne, vous devez rechercher toute la longueur du mot puis multiplier par 0,8 puis faire tout en remplaçant une lettre aléatoire.
var string = 'mystring';
var splitted = string.split('');
var percent = Math.round(splitted.length * 0.8);
var changues =0;
while (changues<percent){
var random = Math.floor((Math.random() * splitted.length ) + 0);
if(splitted[random]!='_'){
splitted[random]='_';
changues++;
}
}
string=splitted.join('');
console.log(string);
Cela a résolu ma question comme je le voulais. Toutes les autres réponses sont appréciées. Ils fonctionnent également. Merci à la communauté Stack Overflow.
String.prototype.replaceAt = function(index, replacement) {
return this.substr(0, index) + replacement + this.substr(index + replacement.length);
}
var a = "mystring";
var len = a.length;
var x = len * 0.8;
var ceil= Math.ceil(x);
var i;
var used = [];
for (i = 0; i < ceil; i++) {
var exist = true;
while (exist) {
var index = Math.floor(Math.random() * len);
exist = used.includes(index);
}
a = a.replaceAt(index, '_');
used.push(index);
}
console.log(a);
J'ai créé une méthode générique pour aborder vos besoins. Il est basé sur la génération d'un Set
qui contiendra un N% des index (avec génération aléatoire) qui seront remplacés. Ensuite, nous utilisons la fonction replacement de replace () pour vérifier à chaque itération si le remplacement d'un token doit être fait, en vérifiant essentiellement si l'index actuel du caractère à remplacer est sur le Set mentionné précédemment .
const replace = (str, token, percentage) =>
{
// Get the quantity of characters to be replaced.
var numToReplace = Math.floor(str.length * percentage);
// Generate a set of random indexes to be replaced.
var idxsToReplace = new Set();
while (idxsToReplace.size < numToReplace)
{
idxsToReplace.add(Math.floor(Math.random() * str.length));
}
// Do the replacement of characters:
return str.replace(/./g, (x, offset) => idxsToReplace.has(offset) ? token : x);
}
console.log(replace("mystring", "_", 0.8));
console.log(replace("mystring", "+", 0.5));
console.log(replace("Hello World", "#", 0.7));
ne pas voir 80 ou 0,8 dans votre code. qu'avez-vous essayé pour y parvenir?
developer.mozilla.org/en-US/ docs / Web / JavaScript / Reference /… ou developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
en fait, le résultat attendu est un remplacement des 87,5% de votre chaîne: que doit-il se passer pour les mots de longueur 9 ou 10?
en fait, 80% signifie 4 caractères sur 5. Donc, pour chaque 5 caractères, souligner 4 caractères et afficher 1 qui peut-être en premier ou en dernier.
Je pense que vous devriez calculer combien de symboles représentent ces 80% pour chaque chaîne et l'utiliser dans la boucle char-replace-pour ne pas dépasser ce nombre lors de la conversion en traits de soulignement;)
J'ai remplacé 100% de ma chaîne par "_". C'est ce que je demande. Je souhaite remplacer 80% de ma chaîne par "_"
aimez-vous remplacer le premier 80% ou le dernier de lettres aléatoires? @KlevisXhyra
if (count% 5 == 0) -> afficher le caractère sinon afficher "_". C'est ça.
disons des lettres aléatoires
De plus, l'incrément (
count ++) doit être en dehors duif.@KlevisXhyra vous devriez vraiment regarder padLeft et padRight
@Haroldo_OK Je le ferai sûrement. Dès que vous avez terminé avec cela. Merci. Très reconnaissant :)