3
votes

Comment remplacer 80% d'une chaîne par "underscore" ("_") en JavaScript?

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 _


12 commentaires

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 du if .


@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 :)


6 Réponses :


1
votes

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, '*'));


2 commentaires

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.



1
votes

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);


1 commentaires

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



0
votes

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))


0 commentaires

2
votes

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);


1 commentaires

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.



1
votes
    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);

0 commentaires

0
votes

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));


0 commentaires