Zlatko Soleniq
Zlatko Soleniq

Reputation: 388

Find the characters in a string which are not duplicated

I have to make a function in JavaScript that removes all duplicated letters in a string. So far I've been able to do this: If I have the word "anaconda" it shows me as a result "anaconda" when it should show "cod". Here is my code:

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

Upvotes: 15

Views: 65225

Answers (29)

Force Bolt
Force Bolt

Reputation: 1221

// 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

Upvotes: 0

Paras
Paras

Reputation: 715

Using Set:

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

Thanks to David comment below.

Upvotes: 3

Muhammad Abdullah
Muhammad Abdullah

Reputation: 4485

Method 1 : one Simple way with just includes JS- function

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

Method 2 : Yes we can make this possible without using JavaScript function :

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

Upvotes: 0

David
David

Reputation: 668

For strings (in one line)

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

For arrays (in one line)

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

Upvotes: 2

masterspambot
masterspambot

Reputation: 516

We can also now clean things up using filter method:

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

Working example:

Upvotes: 15

   function removeDuplicates(string){
      return string.split('').filter((item, pos, self)=> self.indexOf(item) == pos).join('');
   }

the filter will remove all characters has seen before using the index of item and position of the current element

Upvotes: 0

Thilina Koggalage
Thilina Koggalage

Reputation: 1084

console.log(("anaconda").split('').sort().join('').replace(/(.)\1+/g, ""));

By this, you can do it in one line.

output: 'cdo'

Upvotes: 0

Emeeus
Emeeus

Reputation: 5250

Using Set() and destructuring twice is shorter:

const str = 'aaaaaaaabbbbbbbbbbbbbcdeeeeefggggg';

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

console.log(unique);

Upvotes: 1

Hien Nguyen
Hien Nguyen

Reputation: 18975

You can put character as parameter which want to remove as unique like this

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

Upvotes: 2

Anjana Choudhary
Anjana Choudhary

Reputation: 59

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

Upvotes: 0

r0u9hn3ck
r0u9hn3ck

Reputation: 553

  1. If you want your function to just return you a unique set of characters in your argument, this piece of code might come in handy. Here, you can also check for non-unique values which are being recorded in 'nonUnique' titled array:

    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. If you want to return the set of characters with their just one-time occurrences in the passed string, following piece of code might come in handy:

    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'
    

Upvotes: 0

special_cheese
special_cheese

Reputation: 160

function removeduplicate(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;

}

Upvotes: 0

user3163495
user3163495

Reputation: 3518

I have 3 loopless, one-line approaches to this.

Approach 1 - removes duplicates, and preserves original character order:

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

Approach 2 - removes duplicates but does NOT preserve character order, but may be faster than Approach 1 because it uses less Regular Expressions:

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

Approach 3 - removes duplicates, but keeps the unique values (also does not preserve character order):

var str = "anaconda";
var newstr = str.split("").sort().join("").replace(/(.)(?=.*\1)/g, "");
//acdno

Upvotes: 0

Hemanth
Hemanth

Reputation: 139

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"]

Please verify here: https://jsfiddle.net/jmgy8eg9/1/

Upvotes: 1

Akolade Adesanmi
Akolade Adesanmi

Reputation: 1250

This should work using Regex ;
NOTE: Actually, i dont know how this regex works ,but i knew its 'shorthand' , so,i would have Explain to you better about meaning of this /(.+)(?=.*?\1)/g;. this regex only return to me the duplicated character in an array ,so i looped through it to got the length of the repeated characters .but this does not work for a special characters like "#" "_" "-", but its give you expected result ; including those special characters 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')

The regular expression /([a-zA-Z])\1+$/ is looking for:

([a-zA-Z]]) - A letter which it captures in the first group; then \1+ - immediately following it one or more copies of that letter; then $ - the end of the string. Changing it to /([a-zA-Z]).*?\1/ instead searches for:

([a-zA-Z]) - A letter which it captures in the first group; then .*? - zero or more characters (the ? denotes as few as possible); until \1 - it finds a repeat of the first matched character.

Upvotes: 0

jayad aadrit
jayad aadrit

Reputation: 359

Try this code, it works :)

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"

Upvotes: 0

Lukasz Wiktor
Lukasz Wiktor

Reputation: 20422

With lodash:

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

Upvotes: 3

Cerbrus
Cerbrus

Reputation: 72837

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

If you only want to return characters that appear occur once in a string, check if their last occurrence is at the same position as their first occurrence.

Your code was returning all characters in the string at least once, instead of only returning characters that occur no more than once. but obviously you know that already, otherwise there wouldn't be a question ;-)

Upvotes: 11

suryadev
suryadev

Reputation: 107

  //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

Upvotes: 2

Aaron Balthaser
Aaron Balthaser

Reputation: 2622

Just wanted to add my solution for fun:

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

Upvotes: 4

hector-j-rivas
hector-j-rivas

Reputation: 807

Just came across a similar issue (finding the duplicates). Essentially, use a hash to keep track of the character occurrence counts, and build a new string with the "one-hit wonders":

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

Usage:

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

Upvotes: 0

Netikar Sundeep
Netikar Sundeep

Reputation: 11

We can remove the duplicate or similar elements in string using for loop and extracting string methods like slice, substring, substr

Example if you want to remove duplicate elements such as 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);
        }
    }
}

Please let me know if you want some additional information.

Upvotes: -1

Vishal Aggarwal
Vishal Aggarwal

Reputation: 4178

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

Upvotes: -1

asetniop
asetniop

Reputation: 541

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
}

Upvotes: 0

FBN10040
FBN10040

Reputation: 23

This code worked for me on removing duplicate(repeated) characters from a string (even if its words separated by space)

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

Upvotes: 0

mplungjan
mplungjan

Reputation: 177691

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
​

Upvotes: 1

Faiz
Faiz

Reputation: 16245

I have FF/Chrome, on which this works:

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

Which you can reuse if you write a function like:

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

For older browsers that lack map, filter etc, I'm guessing that it could be emulated by jQuery or prototype...

Upvotes: 0

closure
closure

Reputation: 7452

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

Upvotes: 0

Shadow Wizard
Shadow Wizard

Reputation: 66389

Yet another way to remove all letters that appear more than once:

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.

Explanation: you loop once over all the characters in the string, mapping each character to the amount of times it occurred in the string. Then you iterate over the items (letters that appeared in the string) and pick only those which appeared only once.

Upvotes: 0

Related Questions