如何在 JavaScript 中用“下划线”(“_”)替换 80% 的字符串?

Posted

技术标签:

【中文标题】如何在 JavaScript 中用“下划线”(“_”)替换 80% 的字符串?【英文标题】:How to substitute 80% of a string with "underscore" ( " _ " ) in JavaScript? 【发布时间】:2019-06-23 16:11:16 【问题描述】:

我的代码中有一个字符串。我想删除 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.log(splitted);

代码输出:_ _ _ _ _ _ _ _ 所需输出:_ y _ _ _ _ _ _ 或:_ _ s _ _ _ _ _ 或:_ _ _ _ _ i _

【问题讨论】:

在您的代码中看不到 80 或 0,8。您尝试过什么来实现这一目标? developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 或 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 实际上预期的结果是替换 87.5% 的字符串:对于长度为 9 或 10 的单词应该发生什么? 实际上 80% 表示 5 个字符中的 4 个。因此,对于每 5 个字符,下划线 4 个字符并显示可能是第一个或最后一个的 1。 我相信你应该计算一下每个字符串这个 80% 有多少个符号,并在 char-replace-loop 中使用它,以便在转换为下划线时不要超过这个数字;) 【参考方案1】:

我创建了一个通用方法来满足您的需求。它基于Set的生成 这将包含将被替换的索引(随机生成)的N%。然后,我们使用replace() 的replacement 函数来检查每次迭代是否需要替换token,基本上检查要替换的字符的当前索引是否在前面提到的@987654326 @。

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

【讨论】:

【参考方案2】:

如果要替换 80% 的字符串,则需要搜索单词的所有长度,然后乘以 0.8,然后执行 while 替换随机字母。

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

【讨论】:

这解决了我想要的问题。感谢所有其他答案。他们也工作。感谢 Stack Overflow 社区。​​span> 【参考方案3】:

您可以通过检查随机值来替换单个字符。

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

【讨论】:

这种方法使任何字符都有 80% 的概率被替换,因此这可能导致所有字符都被替换,或者以非常低的概率没有字符被替换。这是一种优雅的方法,但是我认为 OP 希望替换字符的 80% 并保持其余部分不变【参考方案4】:
    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);

【讨论】:

【参考方案5】:

您可以先替换所有字母,然后计算字母的数量以恢复原始。

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

【讨论】:

【参考方案6】:

这是我能想到的最接近的简单解决方案。它会以一定的概率隐藏字母。假设你想以“80% 的概率”隐藏字母,那么它就是这样完成的。当然它不会每次都隐藏 80% 的字母:

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

【讨论】:

您可以将模式str.split('').map(cb) 组合到Array.from(str, cb)),因为实现了Symbol.iterator,字符串是可扩展的。 如果你想确保它替换了 80% 的字符,你可以首先构建一个随机的、非重复位置的数组(更好的是 Set())来替换,其中 80%字符串的大小,然后使用它来进行替换。或者可能首先构建一个顺序位置数组,删除其中的 20%,然后使用它来知道要替换字符串上的哪些位置。

以上是关于如何在 JavaScript 中用“下划线”(“_”)替换 80% 的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript标识符

PHP中用下划线开头的变量含义

如何在org-mode中用括号中的单词加下划线以导出到LaTeX

js中用户名的正则(字符,数字,下划线,减号)

Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?

Python全栈之路----面向对象开发----封装