У меня есть строка, как указано в моем коде. Я хочу удалить 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 _ _ _ _ _ _
или : _ _ с _ _ _ _ _
или: _ _ _ _ _ _ я _
на самом деле ожидаемый результат - это замена 87,5% вашей строки: что должно произойти для слов длиной 9 или 10?
на самом деле 80% означает 4 из 5 символов. Итак, для каждых 5 символов подчеркните 4 символа и отобразите 1, который может быть первым или последним.
Я считаю, что вы должны рассчитать, сколько символов составляют эти 80% для каждой строки, и использовать их в цикле замены символов, чтобы не превышать это число при преобразовании в символы подчеркивания;)
Я заменил 100% своей строки на "_". Это то, о чем я спрашиваю. Я хочу заменить 80% моей строки на "_"
вы хотите заменить первые 80% или последние, или случайные буквы? @KlevisXhyra
if (count%5 == 0) -> отобразить символ, иначе отобразить "_". Вот и все.
допустим случайные буквы
Кроме того, приращение (count++) должно быть вне if.
@KlevisXhyra, вам действительно стоит посмотреть на padLeft и padRight
@Haroldo_OK Обязательно буду. Как только закончу с этим. Спасибо. Очень благодарны :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это самое близкое решение просто, которое я могу придумать. Он скроет буквы с определенной вероятностью. Допустим, вы хотите скрыть буквы с вероятностью 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.
Если вы хотите быть уверены, что он заменяет 80% символов, вы можете сначала создать массив (еще лучше, Set()) случайных неповторяющихся позиций для замены с 80% размера строки, а затем использовать это делать замены. Или, может быть, сначала создайте массив последовательных позиций, удалите 20% из них, а затем используйте его, чтобы узнать, какие позиции заменить в строке.
Вы можете заменить один символ, проверив случайное значение.
var string = "mystring",
replaced = string.replace(/./g, c => Math.random() < 0.8 ? '_' : c);
console.info(replaced);Этот подход дает любому символу вероятность замены 80%, поэтому это может привести к замене всех символов или с очень низкой вероятностью ни к одному символу. Это элегантный подход, однако я думаю, что ОП хочет заменить 80% символов и оставить остальные без изменений.
Вы можете сначала заменить все буквы, а затем вычислить количество букв, чтобы вернуться к оригиналу.
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);Это решило мой вопрос, как я хотел. Все остальные ответы приветствуются. Они также работают. Спасибо сообществу переполнения стека.
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));
не видя 80 или 0,8 в вашем коде. что вы пытались добиться этого?