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

时间:2017-10-05 14:40:26

标签: 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) && 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));

以下是一些预期结果:

输入:DGHKHHNL

预计:DGHKHNL

输入:AFKLABAYBIB

预计:AFKLABYBI

输入:JNNNKNND

预计:JNNKD

https://regex101.com/r/WmUPWW/1 ..我也试过使用这个正则表达式来解决这个问题。但这并不能解决这个问题。

请帮忙

4 个答案:

答案 0 :(得分:1)

您应该检查要评估的特定索引的发生次数,而不是计算出现次数。基本上,如果它出现的时间是第3次或更长时间,那么你不需要它。

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

function unique(list) {
  var result = [];

  function findOccurrenceIndex(arr, val, index) {
    var i, j,
      count = 0;
    for (i = 0, j = arr.length; i < j; i++) {
      (arr[i] === val) && count++;
      if (i == index) {
        return count;
      }
    }
    return count;
  }

  $.each(list, function(i, e) {
    if (findOccurrenceIndex(list, e, i) < 3) result.push(e);
  });

  return result.join("");
}
var srting = "DGHKHHNL";
var thelist = srting.split("")
console.log(unique(thelist));

Here is a working example

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

实际上,以下内容将代码简化为单个循环。它通过构建字符计数字典来工作,因为它通过列表工作。 (它也不像你原来的尝试那样依赖JQuery):

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("");
}

Here is a working example

答案 1 :(得分:1)

另一种不依赖于jQuery的方法(尽管你可以轻松地将它与forEach交换):

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("");
}

答案 2 :(得分:1)

这里我使用了两个辅助数组resulttempCounttempCount将每个字母表存储为密钥并对其进行计数,因此如果超过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));

答案 3 :(得分:1)

通过@musefan建立答案,另一个ES6方法可以使用Array.reduce来构建基于累加器对象的计数/输出:

const onlyTwo = list => list.split('').reduce((cache, letter) => {
  cache[letter] ? cache[letter]++ : cache[letter] = 1;
  if (cache[letter] < 3) cache.output += letter;
  return cache;
}, {
  output: ''
}).output;

console.log(onlyTwo('DGHKHHNL'));
console.log(onlyTwo('AFKLABAYBIB'));
console.log(onlyTwo('JNNNKNND'));

您可以通过应用函数式编程原则来分离计算重复项和生成输出字符串的问题来改进这一点。这样,您可以使用具有不同最大值的相同累积技术。

const maxDuplicates = max => list => list.split('').reduce((cache, letter) => {
  cache[letter] ? cache[letter]++ : cache[letter] = 1;
  if (cache[letter] <= max) cache.output += letter;
  return cache;
}, {
  output: ''
}).output;

const onlyTwo = maxDuplicates(2);

console.log(onlyTwo('DGHKHHNL'));
console.log(onlyTwo('AFKLABAYBIB'));
console.log(onlyTwo('JNNNKNND'));

const onlyOne = maxDuplicates(1);

console.log(onlyOne('DGHKHHNL'));
console.log(onlyOne('AFKLABAYBIB'));
console.log(onlyOne('JNNNKNND'));