14

我必须在 JavaScript 中创建一个函数来删除字符串中所有重复的字母。到目前为止,我已经能够做到这一点:如果我有“anaconda”这个词,它会在应该显示“cod”时显示“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'));
4

29 回答 29

16

我们现在还可以使用过滤器方法清理内容:

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

工作示例

于 2016-03-13T23:20:17.503 回答
11

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'));

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

您的代码至少返回一次字符串中的所有字符,而不是只返回出现不超过一次的字符。但显然你已经知道了,否则就不会有问题了;-)

于 2012-12-12T13:52:46.537 回答
4

只是想添加我的解决方案以获得乐趣:

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;
}
于 2016-08-23T15:47:04.527 回答
3

您可以将字符作为要删除的参数作为唯一参数

function find_unique_characters(str, char){
  return [...new Set(str.split(char))].join(char);
}

function find_unique_characters(str, char){
  return [...new Set(str.split(char))].join(char);
}

let result = find_unique_characters("aaaha ok yet?", "a");
console.log(result);

于 2019-06-29T15:17:22.323 回答
3

使用lodash

_.uniq('baraban').join(''); // returns 'barn'
于 2016-11-14T15:00:11.463 回答
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
于 2016-09-29T03:40:24.977 回答
2

使用集合:

removeDuplicates = str => [...new Set(str)].join('');

感谢下面的大卫评论。

于 2019-04-15T08:11:07.613 回答
2

对于字符串(一行)

removeDuplicatesStr = str => [...new Set(str)].join('');

对于数组(一行)

removeDuplicatesArr = arr => [...new Set(arr)]

于 2020-01-16T15:45:25.003 回答
1

演示

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
​
于 2012-12-12T14:50:51.933 回答
1

使用Set()和解构两次更短:

const str = 'aaaaaaaabbbbbbbbbbbbbcdeeeeefggggg';

const unique = [...new Set([...str])].join('');

console.log(unique);

于 2019-09-11T13:09:05.990 回答
1
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/

于 2017-09-28T07:01:34.177 回答
0

Here's what I used - haven't tested it for spaces or special characters, but should work fine for pure strings:

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
}
于 2014-12-11T18:22:32.307 回答
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;
}

现场测试用例

解释:你循环遍历字符串中的所有字符,将每个字符映射到它在字符串中出现的次数。然后你遍历项目(出现在字符串中的字母)并只选择那些只出现一次的项目。

于 2012-12-12T14:00:16.230 回答
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('');
}
于 2012-12-12T14:02:32.197 回答
0

这段代码对我有用,可以从字符串中删除重复的(重复的)字符(即使它的单词用空格分隔)

链接:工作示例 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);
}
于 2013-06-21T15:34:15.440 回答
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 或原型来模拟...

于 2012-12-12T13:58:30.477 回答
0

方法1:一种简单的方法,只包含JS-函数

var data = 'sssssddddddddddfffffff';

    var ary = [];
    var item = '';
    for (const index in data) {
      if (!ary.includes(data[index])) {
        ary[index] = data[index];
        item += data[index];
      }
    }
    console.log(item);

方法 2:是的,我们可以在不使用 JavaScript 函数的情况下实现这一点:

var name = 'sssssddddddddddfffffff';

let i = 0;
let newarry = [];

for (let singlestr of name) {
    newarry[i] = singlestr;
    i++;
}


// now we have new Array and length of string
length = i;

function getLocation(recArray, item, arrayLength) {

    firstLaction = -1;
    for (let i = 0; i < arrayLength; i++) {

        if (recArray[i] === item) {
            firstLaction = i;
            break;
        }

    }

    return firstLaction;

}


let finalString = '';
for (let b = 0; b < length; b++) {
   
    const result = getLocation(newarry, newarry[b], length);
    if (result === b) {
        finalString += newarry[b];
    }

}
console.log(finalString); // sdf
于 2019-12-10T10:38:46.920 回答
0
  1. 如果您希望您的函数只在参数中返回一组独特的字符,那么这段代码可能会派上用场。在这里,您还可以检查记录在“nonUnique”标题数组中的非唯一值:

    function remDups(str){
        if(!str.length)
            return '';
        var obj = {};
        var unique = [];
        var notUnique = [];
        for(var i = 0; i < str.length; i++){
            obj[str[i]] = (obj[str[i]] || 0) + 1;
        }
        Object.keys(obj).filter(function(el,ind){
            if(obj[el] === 1){
                unique+=el;
            }
            else if(obj[el] > 1){
                notUnique+=el;
            }
        });
    return unique;
    }
    console.log(remDups('anaconda')); //prints 'cod'
    
  2. 如果你想返回在传递的字符串中只出现一次的字符集,下面的代码可能会派上用场:

    function remDups(str){
        if(!str.length)
            return '';
        var s = str.split('');
        var obj = {};
        for(var i = 0; i < s.length; i++){
            obj[s[i]] = (obj[s[i]] || 0) + 1;
        }
        return Object.keys(obj).join('');
    }
    console.log(remDups('anaconda')); //prints 'ancod'
    
于 2019-05-25T13:18:12.383 回答
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"
于 2016-08-08T16:15:05.457 回答
0

这应该使用 Regex 工作;
注意:实际上,我不知道这个正则表达式是如何工作的,但我知道它的“速记”,所以,我会更好地向你解释这个的含义/(.+)(?=.*?\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])- 它在第一组中捕获的一封信;then .*?- 零个或多个字符(? 表示尽可能少);直到 \1- 它找到第一个匹配字符的重复。

于 2017-09-19T19:55:07.027 回答
0
console.log(("anaconda").split('').sort().join('').replace(/(.)\1+/g, ""));

这样,您可以在一行中完成。

输出:'cdo'

于 2019-11-06T10:03:20.883 回答
0
    function removeDuplicates(str) {
       var result = "";
       var freq = {};
       for(i=0;i<str.length;i++){
        let char = str[i];
        if(freq[char]) {
          freq[char]++;     
        } else {
           freq[char] =1
           result +=char;
       }
    }
  return result;
}
于 2019-06-02T14:06:27.570 回答
0

删除函数复制(str){

let map = new Map();
// n 
for (let i = 0; i < str.length; i++) {
    if (map.has(str[i])) {
        map.set(str[i], map.get(str[i]) + 1);
    } else {
        map.set(str[i], 1);
    }

}


let res = '';

for (let i = 0; i < str.length; i++) {
    if (map.get(str[i]) === 1) {
        res += str[i];
    }
}

// o (2n) - > O(n)

// space o(n)

return res;

}

于 2019-04-17T01:19:57.420 回答
0

我对此有 3 种无环的单线方法。

方法 1 - 删除重复项,并保留原始字符顺序:

var str = "anaconda";
var newstr = str.replace(new RegExp("[^"+str.split("").sort().join("").replace(/(.)\1+/g, "").replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&")+"]","g"),"");
//cod

方法 2 - 删除重复但不保留字符顺序,但可能比方法 1 更快,因为它使用较少的正则表达式:

var str = "anaconda";
var newstr = str.split("").sort().join("").replace(/(.)\1+/g, "");
//cdo

方法 3 - 删除重复项,但保留唯一值(也不保留字符顺序):

var str = "anaconda";
var newstr = str.split("").sort().join("").replace(/(.)(?=.*\1)/g, "");
//acdno
于 2018-04-06T15:43:44.927 回答
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"
于 2017-06-17T20:23:07.903 回答
0
   function removeDuplicates(string){
      return string.split('').filter((item, pos, self)=> self.indexOf(item) == pos).join('');
   }

过滤器将删除在使用项目索引和当前元素位置之前看到的所有字符

于 2019-11-28T04:07:47.933 回答
0
// Try this way 

const str = 'anaconda';
const printUniqueChar = str => {
   const strArr = str.split("");
   const uniqueArray = strArr.filter(el => {
      return strArr.indexOf(el) === strArr.lastIndexOf(el);
   });
   return uniqueArray.join("");
};
console.log(printUniqueChar(str)); // output-> cod
于 2021-05-05T13:57:34.893 回答
-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;
} 
于 2016-02-21T12:31:18.173 回答
-1

我们可以使用循环删除字符串中的重复或相似元素,for并提取字符串方法,如slice, substring,substr

例如,如果要删除重复元素,例如aababbafabbb

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

如果您想了解更多信息,请告诉我。

于 2016-03-22T09:06:44.457 回答