Javascript 将字符串中的重复字符减少到给定的最小值

Javascript 将字符串中的重复字符减少到给定的最小值,javascript,string,duplicates,character,Javascript,String,Duplicates,Character,我把第一个问题搞乱了:我在寻找比我想出的更优雅的答案。它通过了测试,但很想看到其他解决方案。样本测试包括: reduceString('aaaabbbb', 2) 'aabb' reduceString('xaaabbbb', 2) 'xaabb' reduceString('aaaabbbb', 1) 'ab' reduceString('aaxxxaabbbb', 2) 'aaxxaabb' 以及我的解决方案(通过这些测试): reduceString=函数(str,amo

我把第一个问题搞乱了:我在寻找比我想出的更优雅的答案。它通过了测试,但很想看到其他解决方案。样本测试包括:

reduceString('aaaabbbb', 2) 'aabb'  
reduceString('xaaabbbb', 2) 'xaabb' 
reduceString('aaaabbbb', 1) 'ab'    
reduceString('aaxxxaabbbb', 2)  'aaxxaabb'
以及我的解决方案(通过这些测试):

reduceString=函数(str,amount){
var计数=0;
var结果=“”;
对于(变量i=0;i
我尽量把它缩短:

reduceString = function(str, amount) {
    var finalString = '', cL = '', counter;
    str.split('').forEach(function(i){
        if (i !== cL) counter = 0;
        counter++;
        cL = i;
        if (counter <= amount ) finalString = finalString + i;
    });
    return finalString;
}
reduceString=函数(str,amount){
var finalString='',cL='',计数器;
str.split(“”).forEach(函数(i){
如果(i!==cL)计数器=0;
计数器++;
cL=i;

if(counter只需使用正则表达式

var reduceString = function (str, amount) {
    var re = new RegExp("(.)(?=\\1{" + amount + "})","g");
    return str.replace(re, "");
}

您可以改为使用reg表达式。在javascript中测试

工作原理:

(.) //match any character
\1 //if it follow by the same character
+{2 //more than 1 times
/g //global
$1 //is 1 time by $1$1 is 2 times 

     reduceString('aaaabbbb', 2) 
     reduceString('xaaabbbb', 2) 
            reduceString('aaaabbbb', 1)     
            reduceString('aaxxxaabbbb', 2) 

            function reduceString(txt,num)
            {
                var canRepeat=['$1'];
               for (i=1;i<num;i++)
               {
                  canRepeat.push('$1')
               }
                canRepeat = canRepeat.join('');

                console.log(txt.replace(/(.)\1{2,}/g, canRepeat))

            }      
(.)//匹配任意字符
\1//如果后面跟同一个字符
+{2//超过1次
/g//全球
$1//是1倍乘以$1$1是2倍
减少开支('aaaabbbb',2)
减少限制('xaaabbb',2)
减少开支('aaaabbbb',1)
减少限制('aaxxxaabbb',2)
函数reduceString(txt,num)
{
var canRepeat=['$1'];
对于(i=1;i和正则表达式:

var reduceString = function(str, amount) {
var x = [ ...new Set(str) ];
for (var c of x){
    var rex = new RegExp(c + '{'+amount+',}','g');
    str = str.replace(rex,string(c,amount));
  }
  return str;
};

var string = function(c,amount){
    for(var i=0,s="";i<amount;i++)s+=c;
    return s;
};
var reduceString=函数(str,amount){
var x=[…新集合(str)];
对于(x的c值){
var rex=newregexp(c+'{'+amount+',}','g');
str=str.replace(rex,string(c,amount));
}
返回str;
};
变量字符串=函数(c,金额){

对于(var i=0,s=”“;i我想我的最佳解决方案是

var str=“axxxaabbcaaxxaab”,
redStr=(s,n)=>s.replace(/(\w)\1+/g,“$1”。重复(n));

console.log(redStr(str,2));
看看@e4en,它甚至更干净。@marcovalent确实如此!我需要把你的答案写下来;)很好!我试图用正则表达式来做,但这很好!想必你想要顺序重复的字符,而不仅仅是重复?@RobG-yup根据样本,看起来这就是他们测试的目的。
var reduceString = function(str, amount) {
var x = [ ...new Set(str) ];
for (var c of x){
    var rex = new RegExp(c + '{'+amount+',}','g');
    str = str.replace(rex,string(c,amount));
  }
  return str;
};

var string = function(c,amount){
    for(var i=0,s="";i<amount;i++)s+=c;
    return s;
};