仅在字符串中显示一次唯一字符

时间:2012-12-13 20:35:45

标签: javascript string character unique

我有一个重复字母的字符串。我希望不止一次重复的字母只显示一次。例如,我有一个字符串aaabbbccc我希望结果是abc。到目前为止,我的功能是这样的:

  • 如果信件没有重复,则不会显示
  • 如果它重复一次,它只显示一次(即aa显示a)
  • 如果重复两次,则显示全部(即aaa显示aaa)
  • 如果重复3次,则显示6次(如果aaaa显示aaaaaa)
function unique_char(string) {
    var unique = '';
    var count = 0;
    for (var i = 0; i < string.length; i++) {
        for (var j = i+1; j < string.length; j++) {
            if (string[i] == string[j]) {
                count++;
                unique += string[i];
            }
        }
    }
    return unique;
}

document.write(unique_char('aaabbbccc'));

该函数必须在循环内循环;这就是为什么第二个for在第一个内部。

11 个答案:

答案 0 :(得分:17)

首先将其转换为数组,然后使用答案here,并重新加入,如下所示:

var nonUnique = "ababdefegg";
var unique = nonUnique.split('').filter(function(item, i, ar){ return ar.indexOf(item) === i; }).join('');

全部在一行: - )

答案 1 :(得分:10)

使用字符填充Set并连接其唯一条目:

function makeUnique(str) {
  return String.prototype.concat(...new Set(str))
}

console.log(makeUnique('abc'));    // "abc"
console.log(makeUnique('abcabc')); // "abc"

答案 2 :(得分:1)

您可以将regular expressioncustom replacement function

一起使用
function unique_char(string) {
    return string.replace(/(.)\1*/g, function(sequence, char) {
         if (sequence.length == 1) // if the letter doesn't repeat
             return ""; // its not shown
         if (sequence.length == 2) // if its repeated once
             return char; // its show only once (if aa shows a)
         if (sequence.length == 3) // if its repeated twice
             return sequence; // shows all(if aaa shows aaa)
         if (sequence.length == 4) // if its repeated 3 times
             return Array(7).join(char); // it shows 6( if aaaa shows aaaaaa)
         // else ???
         return sequence;
    });
}

答案 3 :(得分:1)

可能为时已晚,但仍然是我对这篇文章的回答:

function extractUniqCharacters(str){
    var temp = {};
    for(var oindex=0;oindex<str.length;oindex++){
        temp[str.charAt(oindex)] = 0; //Assign any value
    }
    return Object.keys(temp).join("");
}

答案 4 :(得分:0)

根据实际问题:&#34;如果信件没有重复,则不显示&#34;

function unique_char(str)
{
    var obj = new Object();

    for (var i = 0; i < str.length; i++)
    {
        var chr = str[i];
        if (chr in obj)
        {
            obj[chr] += 1;
        }
        else
        {
            obj[chr] = 1;
        }
    }

    var multiples = [];
    for (key in obj)
    {
        // Remove this test if you just want unique chars
        // But still keep the multiples.push(key)
        if (obj[key] > 1)
        {
            multiples.push(key);
        }
    }

    return multiples.join("");
}

var str = "aaabbbccc";
document.write(unique_char(str));

答案 5 :(得分:0)

您的问题是,每次在unique中找到角色时,您都会添加string。真的你应该做这样的事情(因为你指定的答案必须是嵌套的for循环):

function unique_char(string){

    var str_length=string.length;
    var unique='';

    for(var i=0; i<str_length; i++){

        var foundIt = false;
        for(var j=0; j<unique.length; j++){

            if(string[i]==unique[j]){

                foundIt = true;
                break;
            }

        }

        if(!foundIt){
            unique+=string[i];
        }

    }

   return unique;
}

document.write( unique_char('aaabbbccc'))

在此我们只会将string中找到的字符添加到unique,如果它已经存在的话。这根本不是一种有效的方法......但根据你的要求它应该有效。

我无法运行此功能,因为我没有任何方便运行JavaScript ...但此方法中的理论应该可行。

答案 6 :(得分:0)

使用lodash

_.uniq('aaabbbccc').join(''); // gives 'abc'

答案 7 :(得分:0)

如果必须重复显示一次重复字符,请尝试此操作,即 对于i / p:aaabbbccc o / p:abc

var str="aaabbbccc";
Array.prototype.map.call(str, 
  (obj,i)=>{
    if(str.indexOf(obj,i+1)==-1 ){
     return obj;
    }
  }
).join("");
//output: "abc"

如果只需显示唯一字符(String Bombarding Algo),请添加另一个&#34;和&#34;条件删除多次出现的字符并仅显示唯一字符,即 对于i / p:aabbbkaha o / p:kh

var str="aabbbkaha";
Array.prototype.map.call(str, 
 (obj,i)=>{
   if(str.indexOf(obj,i+1)==-1 && str.lastIndexOf(obj,i-1)==-1){ // another and condition
     return obj;
   }
 }
).join("");
//output: "kh"

答案 8 :(得分:0)

{{1}}

答案 9 :(得分:0)

这是最简单的功能

  function remove(text) 
    {
      var unique= "";
      for(var i = 0; i < text.length; i++)
      {
        if(unique.indexOf(text.charAt(i)) < 0) 
        {
          unique += text.charAt(i);
        }
      }
      return unique;
    }

答案 10 :(得分:0)

const countUnique = (s1, s2) => new Set(s1 + s2).size

基于@le_m答案的更短方法