2012-12-12 72 views
8

我必須在JavaScript中創建一個刪除字符串中所有重複字母的函數。到目前爲止,我已經能夠做到這一點:如果我有「anaconda」這個詞,它顯示了我應該顯示「鱈魚」時的結果「anaconda」。這裏是我的代碼:刪除字符串中的重複字符

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

看起來你缺少一些代碼? jsfiddle.net也適用於這類問題。 – WildCrustacean

+3

http://jsfiddle.net/mplungjan/FHUgY/爲我工作 - 我得到穀倉 – mplungjan

+0

我,甚至IE 8 – nozzleman

回答

7

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

 
console.log(find_unique_characters('baraban')); 
 
console.log(find_unique_characters('anaconda'));

如果你只想要回出現在一個字符串出現一次的字符,檢查他們的最後一次出現是在相同的位置,他們的第一次出現。

您的代碼至少返回一次字符串中的所有字符,而不是僅返回發生不超過一次的字符。 但顯然你已經知道了,否則就不會有問題;-)

+1

而不是在此上下調其中一個更高效的答案問題抱怨複雜性,你如何添加自己的答案,沒有n^2複雜性,@ ZacB?不要告訴某人完全重寫他們的答案,而不會提出一些建議。這不是建設性的,坦率地說,是粗魯的。 – Cerbrus

+0

'lastIndexOf'和'indexOf'是O(N)操作(其中N是輸入字符串的長度)。許多JS引擎/字符串對象實現會使用字典緩存這些內容或返回的字符串,但這不是100%的時間,也不是給定的。更好地交換臨時空間並像其他答案一樣使用對象。你可以通過改變輸入字符串來緩解空間折衷,但是在那裏的複製使得它成爲一個有爭議的問題。 –

+2

就像我說的,提供你自己的答案。不要只是告訴某人完全重寫一個_working,upvoted_答案,因爲它不如它能夠做到的那樣高效。 – Cerbrus

0

我有FF/Chrome瀏覽器,在其工作的:

var h={}; 
"anaconda".split(""). 
    map(function(c){h[c] |= 0; h[c]++; return c}). 
    filter(function(c){return h[c] == 1}). 
    join("") 

如果你寫一個,你可以重複使用功能,如:

function nonRepeaters(s) { 
    var h={}; 
    return s.split(""). 
    map(function(c){h[c] |= 0; h[c]++; return c}). 
    filter(function(c){return h[c] == 1}). 
    join(""); 
} 

對於缺乏mapfilter等等,我猜它可能的jQuery或原型來模擬舊的瀏覽器...

+0

除了跨瀏覽器兼容性「顛簸」之外,像這樣的數組操作[相對較慢](http://jsperf.com/unique-in-string)。 – Cerbrus

+0

@Cerbrus毫不奇怪。如果我打算在緊張的環境中或在各地使用它,我可能會寫一些像你一樣的東西。只是有一個聲明性的例子是很好的 - 如果他們希望更多地瞭解關鍵性的代碼而不是性能關鍵的代碼段,可能會有接受者......感謝您的基準測試! – Faiz

+0

事實上,即使某些解決方案因沒有明顯原因而遭到粗暴低估,仍然有很多解決方案可以解決問題。 (嘗試提供非jQuery解決方案時,一些jQueries得到5票);-) 總是有多條路到羅馬。 – Cerbrus

0

另一種方式來刪除多次出現的所有字母:

function find_unique_characters(string) { 
    var mapping = {}; 
    for(var i = 0; i < string.length; i++) { 
     var letter = string[i].toString(); 
     mapping[letter] = mapping[letter] + 1 || 1; 
    } 
    var unique = ''; 
    for (var letter in mapping) { 
     if (mapping[letter] === 1) 
      unique += letter; 
    } 

    return unique; 
} 

Live test case

說明:您在字符串中的所有字符上循環一次,將每個字符映射到字符串中出現的次數。然後你遍歷這些項目(字符串中出現的字母),只挑選出現一次的項目。

+0

有了2個循環和一個臨時對象,這對我來說似乎有點像rube goldberg。 – Cerbrus

+0

是的,好主意,但可以在一個循環中實現替換 – mplungjan

+0

謝謝,但有沒有另一種方式鍵入(var字母映射)因爲我真的不明白那部分 –

0
function removeDup(str) { 
    var arOut = []; 
    for (var i=0; i < str.length; i++) { 
    var c = str.charAt(i); 
    if (c === '_') continue; 
    if (str.indexOf(c, i+1) === -1) { 
     arOut.push(c); 
    } 
    else { 
     var rx = new RegExp(c, "g"); 
     str = str.replace(rx, '_'); 
    } 
    } 
    return arOut.join(''); 
} 
1

DEMO

function find_unique_characters(string){ 
    unique=[]; 
    while(string.length>0){ 
     var char = string.charAt(0); 
     var re = new RegExp(char,"g"); 
     if (string.match(re).length===1) unique.push(char); 
     string=string.replace(re,""); 
    }   
    return unique.join(""); 
} 
console.log(find_unique_characters('baraban')); // rn 
console.log(find_unique_characters('anaconda')); //cod 
​ 
0

此代碼爲我工作從一個字符串刪除重複(重複)的字符(即使其詞用空格隔開)

鏈接:Working Sample JSFiddle

/* This assumes you have trim the string and checked if it empty */ 
function RemoveDuplicateChars(str) { 
    var curr_index = 0; 
    var curr_char; 
    var strSplit; 
    var found_first; 
    while (curr_char != '') { 
     curr_char = str.charAt(curr_index); 
     /* Ignore spaces */ 
     if (curr_char == ' ') { 
     curr_index++; 
     continue; 
     } 
     strSplit = str.split(''); 
     found_first = false; 
     for (var i=0;i<strSplit.length;i++) { 
     if(str.charAt(i) == curr_char && !found_first) 
      found_first = true; 
     else if (str.charAt(i) == curr_char && found_first) { 
      /* Remove it from the string */ 
      str = setCharAt(str,i,''); 
     } 
     } 
     curr_index++; 
    } 
    return str; 
} 
function setCharAt(str,index,chr) { 
    if(index > str.length-1) return str; 
    return str.substr(0,index) + chr + str.substr(index+1); 
} 
0

這是我用過的 - 沒有測試它的空間或特殊效果官方人物,但應該工作的優良純字符串:

function uniquereduce(instring){ 
    outstring = '' 
    instringarray = instring.split('') 
    used = {} 
    for (var i = 0; i < instringarray.length; i++) { 
     if(!used[instringarray[i]]){ 
      used[instringarray[i]] = true 
      outstring += instringarray[i] 
     } 
    } 
    return outstring 
} 
+0

OP希望所有出現不止一次的字符都被刪除。對於''anaconda'',他需要''cod「'作爲輸出。你的函數返回''ancod「'。 – Cerbrus

-1
function RemDuplchar(str) 
{ 
    var index={},uniq='',i=0; 
    while(i<str.length) 
    { 
     if (!index[str[i]]) 
     { 
     index[str[i]]=true; 
     uniq=uniq+str[i]; 
     } 
      i++; 
    } 
    return uniq; 
} 
+0

OP希望所有出現多次的字符都被刪除。對於''anaconda'',他需要''cod「'作爲輸出。你的函數返回''ancod「'。 – Cerbrus

3

我們現在也可以乾淨的東西了使用過濾器的方法:

function removeDuplicateCharacters(string) { 
    return string 
    .split('') 
    .filter(function(item, pos, self) { 
     return self.indexOf(item) == pos; 
    }) 
    .join(''); 
} 
console.log(removeDuplicateCharacters('baraban')); 

工作例如: https://jsfiddle.net/masterspambot/ppz6uec1/

-1

我們可以使用for循環刪除字符串中的重複或類似元素,並提取字符串方法,如slicesubstring,如果你想刪除重複的元素,如aababbafabbbsubstr

例子:

var data = document.getElementById("id").value 
for(var i = 0; i < data.length; i++) 
{ 
    for(var j = i + 1; j < data.length; j++) 
    { 
     if(data.charAt(i)==data.charAt(j)) 
     { 
      data = data.substring(0, j) + data.substring(j + 1); 
      j = j - 1; 
      console.log(data); 
     } 
    } 
} 

請讓我知道如果你想要一些額外的信息。

+0

OP希望所有出現多次的字符都被刪除。對於''anaconda'',他需要''cod「'作爲輸出。你的函數返回''ancod「'。 – Cerbrus

0

剛剛遇到類似的問題(找到重複)。從本質上講,使用哈希來跟蹤字符出現次數,並建立一個新的字符串「一擊中奇蹟」:

function oneHitWonders(input) { 
    var a = input.split(''); 
    var l = a.length; 
    var i = 0; 
    var h = {}; 
    var r = ""; 

    while (i < l) { 
     h[a[i]] = (h[a[i]] || 0) + 1; 

     i += 1; 
    } 

    for (var c in h) { 
     if (h[c] === 1) { 
      r += c; 
     } 
    } 

    return r; 
} 

使用

var a = "anaconda"; 
var b = oneHitWonders(a); // b === "cod" 
3

只想添加我爲樂趣的解決方案:

function removeDoubles(string) { 
    var mapping = {}; 
    var newString = ''; 

    for (var i = 0; i < string.length; i++) { 
    if (!(string[i] in mapping)) { 
     newString += string[i]; 
     mapping[string[i]] = true; 
    } 
    } 
    return newString; 
} 
2
//One simple way to remove redundecy of Char in String 
     var char = "aaavsvvssff"; //Input string 
     var rst=char.charAt(0); 
     for(var i=1;i<char.length;i++){    
      var isExist = rst.search(char.charAt(i)); 
      isExist >=0 ?0:(rst += char.charAt(i)); 
     } 
     console.log(JSON.stringify(rst)); //output string : avsf 
0

隨着lodash

_.uniq('baraban').join(''); // returns 'barn' 
0

試試這個代碼,它的工作原理:)

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

這應該使用正則表達式;
其實,我不知道這個正則表達式是如何工作的,但我知道它的'速記',所以,我會更好地向你解釋這個/(.+)(?=.*?\1)/g;的含義。 這個正則表達式只返回給我一個數組中的重複字符,所以我通過它來獲得重複字符的長度。但這不適用於像"#" "_" "-",這樣的特殊字符,但它會給您預期的結果;包括那些特殊字符if any

function removeDuplicates(str){ 
    var REPEATED_CHARS_REGEX = /(.+)(?=.*?\1)/g; 
    var res = str.match(REPEATED_CHARS_REGEX); 
    var word = res.slice(0,1); 
    var raw = res.slice(1); 
    var together = new String (word+raw); 
    var fer = together.toString(); 
    var length = fer.length; 
    // my sorted duplicate; 
     var result = ''; 
     for(var i = 0; i < str.length; i++) { 
     if(result.indexOf(str[i]) < 0) { 
      result += str[i]; 
     } 
     } 

     return {uniques: result,duplicates: length}; 
    } removeDuplicates('anaconda') 

正則表達式/([a-zA-Z])\1+$/正在尋找:

([a-zA-Z]]) - 它在第一組中捕獲的信;然後 \1+ - 緊隨其後的那封信的一個或多個副本;然後 $ - 字符串的結尾。 它更改爲/([a-zA-Z]).*?\1/代替搜索:

([a-zA-Z]) - 它在第一組中捕獲的信;然後 .*? - 零個或多個字符(?表示儘可能少);直到 \1 - 它找到第一個匹配字符的重複。

0
var str = 'anaconda'.split(''); 
var rmDup = str.filter(function(val, i, str){ 
    return str.lastIndexOf(val) === str.indexOf(val); 
}); 
console.log(rmDup); //prints ["c", "o", "d"] 

請確認這裏:https://jsfiddle.net/jmgy8eg9/1/