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

时间:2019-01-30 11:29:39

标签: javascript arrays node.js string

我的代码中有一个字符串。我想删除80%的字符串字母,并将其替换为“ _”(下划线)。

我设法用“ _”替换所有字符串char,但是我不能使其仅替换字符串的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 _

6 个答案:

答案 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.log(string);

答案 1 :(得分:1)

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

/*func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {

        return UITableView.automaticDimension
}*/

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您可以先替换所有字母,然后计算字母数以返回到原始字母。

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

答案 4 :(得分:0)

    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 :(得分:0)

我已经创建了一种通用方法来满足您的需求。它基于Set的生成  将保存N%个索引(具有随机生成),这些索引将被替换。然后,我们使用replace()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.log(replace("mystring", "_", 0.8));
console.log(replace("mystring", "+", 0.5));
console.log(replace("Hello World", "#", 0.7));