Как заменить 80% строки на «подчеркивание» (« _ ») в JavaScript?

У меня есть строка, как указано в моем коде. Я хочу удалить 80% строковых букв и заменить их на «_» (подчеркивание).

Мне удалось заменить все строковые символы на «_», но я не могу заставить его заменить только 80% моей строки.

var a = "mystring";
var splitted = a.split('');

var count = 0;
while(count < a.length) {
    if (splitted[count] !== '_' && splitted[count] !== ' ') {
        splitted[count] = '_ ';
        count++;
    } 
 }

console.info(splitted);

Вывод кода: _ _ _ _ _ _ _ _
Желаемый результат: _ y _ _ _ _ _ _
или : _ _ с _ _ _ _ _
или: _ _ _ _ _ _ я _

не видя 80 или 0,8 в вашем коде. что вы пытались добиться этого?

Philipp Sander 30.01.2019 12:31

на самом деле ожидаемый результат - это замена 87,5% вашей строки: что должно произойти для слов длиной 9 или 10?

Fabrizio Calderan 30.01.2019 12:32

на самом деле 80% означает 4 из 5 символов. Итак, для каждых 5 символов подчеркните 4 символа и отобразите 1, который может быть первым или последним.

Santhosh Arun 30.01.2019 12:35

Я считаю, что вы должны рассчитать, сколько символов составляют эти 80% для каждой строки, и использовать их в цикле замены символов, чтобы не превышать это число при преобразовании в символы подчеркивания;)

krankuba 30.01.2019 12:35

Я заменил 100% своей строки на "_". Это то, о чем я спрашиваю. Я хочу заменить 80% моей строки на "_"

klevisx 30.01.2019 12:36

вы хотите заменить первые 80% или последние, или случайные буквы? @KlevisXhyra

eborrallo 30.01.2019 12:37

if (count%5 == 0) -> отобразить символ, иначе отобразить "_". Вот и все.

Santhosh Arun 30.01.2019 12:38

допустим случайные буквы

klevisx 30.01.2019 12:38

Кроме того, приращение (count++) должно быть вне if.

Haroldo_OK 30.01.2019 12:46

@KlevisXhyra, вам действительно стоит посмотреть на padLeft и padRight

Callum Linington 30.01.2019 14:04

@Haroldo_OK Обязательно буду. Как только закончу с этим. Спасибо. Очень благодарны :)

klevisx 30.01.2019 14:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
12
220
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Это самое близкое решение просто, которое я могу придумать. Он скроет буквы с определенной вероятностью. Допустим, вы хотите скрыть буквы с вероятностью 80%, тогда это делается так. Конечно, он не будет каждый раз скрывать 80% букв:

const hideLetters = (str = '', probability = 1, mask = '_') => {
  return str
    .split('')
    .map((letter, i) => (Math.random() >= probability) ? letter : mask)
    .join('');
}

console.info(hideLetters('mystring', 0.8));
console.info(hideLetters('password', 0.5, '*'));

вы можете комбинировать шаблон str.split('').map(cb) с Array.from(str, cb)), потому что строки расширяемы из-за реализованного Symbol.iterator.

Nina Scholz 30.01.2019 13:12

Если вы хотите быть уверены, что он заменяет 80% символов, вы можете сначала создать массив (еще лучше, Set()) случайных неповторяющихся позиций для замены с 80% размера строки, а затем использовать это делать замены. Или, может быть, сначала создайте массив последовательных позиций, удалите 20% из них, а затем используйте его, чтобы узнать, какие позиции заменить в строке.

Haroldo_OK 30.01.2019 13:26

Вы можете заменить один символ, проверив случайное значение.

var string = "mystring",
    replaced = string.replace(/./g, c => Math.random() < 0.8 ? '_' : c);
    
console.info(replaced);

Этот подход дает любому символу вероятность замены 80%, поэтому это может привести к замене всех символов или с очень низкой вероятностью ни к одному символу. Это элегантный подход, однако я думаю, что ОП хочет заменить 80% символов и оставить остальные без изменений.

Shidersz 30.01.2019 17:35

Вы можете сначала заменить все буквы, а затем вычислить количество букв, чтобы вернуться к оригиналу.

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.info(replace("mystring lorem", 0.8))
console.info(replace("mystring", 0.8))
console.info(replace("Lorem ipsum dolor sit amet.", 0.2))

Если вы хотите заменить 80% вашей строки, вам нужно найти всю длину слова, а затем умножить на 0,8, а затем сделать это, чтобы заменить случайную букву.

     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.info(string);

Это решило мой вопрос, как я хотел. Все остальные ответы приветствуются. Они также работают. Спасибо сообществу переполнения стека.

klevisx 30.01.2019 14:13
Ответ принят как подходящий
    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.info(a);

Я создал общий метод для удовлетворения ваших потребностей. Он основан на генерации Набор который будет содержать N% индексов (со случайной генерацией), которые будут заменены. Затем мы используем функцию replacement из заменять() для проверки на каждой итерации необходимости замены token, в основном проверяя, является ли текущий индекс заменяемого символа на ранее упомянутом Set.

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.info(replace("mystring", "_", 0.8));
console.info(replace("mystring", "+", 0.5));
console.info(replace("Hello World", "#", 0.7));

Другие вопросы по теме