Javascript 从出现两次以上的字符串中删除字符

Javascript 从出现两次以上的字符串中删除字符,javascript,jquery,Javascript,Jquery,我想删除字符串中第三个出现的字符 以下是我从我这边开始的尝试: function unique(list) { var result = []; function findOccurrences(arr, val) { var i, j, count = 0; for (i = 0, j = arr.length; i < j; i++) { (arr[i] === val) &&

我想删除字符串中第三个出现的字符

以下是我从我这边开始的尝试:

function unique(list) {
    var result = [];
    function findOccurrences(arr, val) {
        var i, j,
            count = 0;
        for (i = 0, j = arr.length; i < j; i++) {
            (arr[i] === val) && count++;
        }
        return count;
    }
    $.each(list, function(i, e) {
        if (findOccurrences(list, e) < 3) result.push(e);
    });
    return result.join("");
}
var srting = "DGHKHHNL";
var thelist = srting.split("")
console.log(unique(thelist));
功能唯一(列表){
var结果=[];
函数findOccurrences(arr、val){
var i,j,
计数=0;
对于(i=0,j=arr.length;i
以下是一些预期结果:

输入:DGHKHHL

预期:DGHKHNL

输入:AFKLABAYBIB

预期:阿夫克拉比比

输入:jnnknnd

预期:JNNKD

。。我也尝试使用这个正则表达式来解决这个问题。但这并不能解决问题


请帮助

您应该检查正在评估的特定索引的发生次数,而不是计算发生次数。基本上,如果它是第三次或更多次出现,那么你不想要它

对代码稍作更改即可实现此目的(您可能希望选择更好的函数名):

功能唯一(列表){
var结果=[];
函数findOccurrenceIndex(arr、val、index){
var i,j,
计数=0;
对于(i=0,j=arr.length;i


请注意,这个答案基于您当前的代码,我希望您可以重构逻辑以减少代码混乱

事实上,下面将代码简化为一个循环。它通过在列表中运行时构建字符计数字典来工作。(它也不像您最初的尝试那样依赖JQuery):

功能唯一(列表){
var结果=[];
变量计数={};
对于(变量i=0;i

一种不依赖jQuery的替代方法(尽管您可以轻松地用forEach交换):


这里我使用了两个助手数组
result
tempCount
tempCount
是将每个字母表存储为键并计数,因此如果超过3

function unique(list) {
    var result = [];
    var tempCount = [];
    list = list.split("");
    for(var i=0;i < list.length;i++) {
        if(tempCount[list[i]]) {
            if(tempCount[list[i]] == 2) continue;
            tempCount[list[i]]++;
        } else {
            tempCount[list[i]] = 1;            
        }
        result.push(list[i]);
    }
    return result.join("");
}
var srting = "JNNNKNND";
console.log(unique(srting));
功能唯一(列表){
var结果=[];
var tempCount=[];
list=list.split(“”);
对于(变量i=0;i
根据@musefan的答案,另一种ES6方法可以使用
数组。reduce
基于累加器对象构建计数/输出:

constonlytwo=list=>list.split(“”).reduce((缓存,字母)=>{
缓存[字母]?缓存[字母]+:缓存[字母]=1;
if(cache[letter]<3)cache.output+=letter;
返回缓存;
}, {
输出:“”
}).产出;
log(仅两个('dghkhnl'));
console.log(仅两个('AFKLABAYBIB'));

log(仅两个('jnnknnd'))非常感谢您的帮助。正是我想要的wanted@SharmisthaKhound:不用担心,如果您感兴趣,我已经添加了另一种方法。其他人已经提供了解决方案,但请注意如何使用regex。正则表达式引擎允许可变宽度lookbehinds的语言可以解决这个问题,但javascript正则表达式不允许,所以不能单独使用正则表达式。
function unique(list) {
  var result = [];
  var counts = {};

  for (var i = 0; i < list.length; i++) {
    var c = list[i];
    if (!counts[c])
      counts[c] = 0;
    counts[c]++;
    if (counts[c] < 3) {
      result.push(c);
    }
  }

  return result.join("");
}
function unique(str) {
    var count = {}
    return str.split("").reduce((acc, cur) => {
        if (!(cur in count)) {
            count[cur] = 1;
            acc.push(cur);
            return acc;
        }

        if (count[cur] == 2) return acc;

        acc.push(cur);
        count[cur]++;
        return acc;
    }, []).join("");
}
function unique(list) {
    var result = [];
    var tempCount = [];
    list = list.split("");
    for(var i=0;i < list.length;i++) {
        if(tempCount[list[i]]) {
            if(tempCount[list[i]] == 2) continue;
            tempCount[list[i]]++;
        } else {
            tempCount[list[i]] = 1;            
        }
        result.push(list[i]);
    }
    return result.join("");
}
var srting = "JNNNKNND";
console.log(unique(srting));