【问题标题】:Javascript: Determine if all characters in a string are unique and if not, delete duplicate charactersJavascript:确定字符串中的所有字符是否都是唯一的,如果不是,则删除重复的字符
【发布时间】:2013-06-24 22:07:10
【问题描述】:

使用a[letter][occurences] 设置了一个数组,但在遍历该数组以检查occurences > 1 并删除它们时遇到了困难。

function charFreq(s) {
    var i, j;
    var a = new Array();

    for (j = 0; j < s.length; j++) {
        for (i = 0; i < a.length; i++) {
            if (a[i][0] == s[j]) {
                a[i][1]++;
                break;
            }
        }
        if (i == a.length) {
            a[i] = [s[j], 1];
        }
    }
    return a[i][0];
}
document.write(charFreq("insert string here"));

这是我迄今为止想出的烂摊子:

function check(str) {
    var c;
    for (c=0; c < a.length; c++) {
        if(a[c][1] == 1) {
            return true;
            break;
        } else {
            return false;
        }
    }
}

【问题讨论】:

    标签: javascript string unique


    【解决方案1】:

    使用 ES6 集:

    // :: unique = Array<any>|string => Array<any>
    const unique = xs => [...new Set(xs)]
    
    const dedupe = str => unique(str).join('')
    
    console.log(
      unique('foo'), // => ['f', 'o']
      dedupe('foo'), // => 'fo'
    )

    【讨论】:

    • 这正是我要找的,简单易行的“设置”:)
    【解决方案2】:

    不要那样做。

    function noDups( s ) {
      var chars = {}, rv = '';
    
      for (var i = 0; i < s.length; ++i) {
        if (!(s[i] in chars)) {
          chars[s[i]] = 1;
          rv += s[i];
        }
      }
    
      return rv;
    }
    
    alert(noDups("Shoe fly pie, and apple pan dowdy")); // Shoe flypi,andw
    

    随着字符串的长度变长,您的代码会变慢,其速度大致等于字符串长度的平方

    【讨论】:

    • 如果我要为重复计算单独计算一个数组,它会放在 else 语句中吗?还是我想创建一个新功能?
    • @JSNewb 这个函数返回一个新数组。它可以修改为也返回地图,并且地图将包含计数。 (如果你愿意,它也可以变成一个数组。)
    【解决方案3】:

    要从字符串中删除重复字符,您可以使用使用户@Cerbrus 的下一个函数

    function find_unique_characters( string ){
        var unique='';
        for(var i=0; i<string.length; i++){
            if(string.lastIndexOf(string[i]) == string.indexOf(string[i])){
                unique += string[i];
            }
        }
        return unique;
    }
    console.log(find_unique_characters('baraban'));
    

    如果您只想返回出现一次的字符 字符串,检查它们最后一次出现的位置是否与 他们的第一次出现。

    您的代码至少返回一次字符串中的所有字符, 而不是只返回出现不超过一次的字符

    链接到stackoverflow的线程Remove duplicate characters from string

    【讨论】:

      【解决方案4】:

      这是一个快速的方法:

      str = str.split('').filter(function(v,i,self){
        return self.indexOf(v) == i;
      }).join('');
      

      【讨论】:

      • 很好,但在输入时它只是“快速”:-)
      • @Pointy:是的。我猜这不是最有效的,但你应该从什么时候开始真正担心?
      • 100 个字符的字符串比使用地图的近线性算法慢 100 倍。也许没什么大不了的;视情况而定。
      【解决方案5】:
      function RemoveDuplicateLetters(input) {
          var result = '', i = 0, char = '';
          while (i < input.length) {
              char = input.substring(i, i+1);
              result += char;
              input = input.replace(char,'');
          }
          return result;
      }
      

      【讨论】:

      • 考虑charAt而不是substring。此外,+= 运算符在某些浏览器中速度很慢,添加到数组中会快得多(在其他浏览器中不会慢得多)。
      【解决方案6】:

      我看不到 splice 版本,所以这里有一个:

      function uniqueChars(s) {
        var s = s.split('');
        var c, chars = {}, i = 0;
      
        while ((c = s[i])) {
          c in chars? s.splice(i, 1) : chars[c] = ++i;
        }
        return s.join('');
      }
      

      【讨论】:

        【解决方案7】:

        这假定只有字母字符,并且大写不等于小写。

        function uniqueChars(string){
            var i= 0, L= string.length, ustring= '', next;
            while(i<L){
                next= string.charAt(i++);
                if(ustring.indexOf(next)== -1) ustring+= next;
            }
            return ustring.replace(/[^a-zA-Z]/g, '');
        }
        var s1= 'The quick red fox jumps over the lazy brown dog.';
        uniqueChars(s1)
        

        /* 返回值:(字符串) Thequickrdfoxjmpsvtlazybwng */

        这将返回任何唯一字符-

        function uniqueArray(array){
            return array.filter(function(itm, i, T){
                return T.indexOf(itm)== i;
            });
        }
        var s1= 'The quick red fox jumps over the lazy brown dog.';
        uniqueArray(s1.split('')).join('');
        

        /* 返回值:(字符串) quickrdfoxjmpsvtlazybwng。 */

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-26
          • 2015-04-30
          • 2022-01-20
          • 1970-01-01
          • 1970-01-01
          • 2014-01-01
          相关资源
          最近更新 更多