Menampilkan karakter unik dalam sebuah string hanya sekali

Saya memiliki string dengan huruf berulang. Saya ingin surat yang diulang lebih dari satu kali hanya ditampilkan satu kali. Misalnya saya punya string aaabbbccc saya ingin hasilnya abc. sejauh ini fungsi saya berfungsi seperti ini:

  • jika surat itu tidak diulang, maka tidak ditampilkan
  • jika diulang satu kali, maka hanya ditampilkan satu kali (yaitu aa menampilkan a)
  • jika diulang dua kali, tampilkan semua (yaitu aaa tampilkan aaa)
  • jika diulang 3 kali maka akan muncul 6 (jika aaaa muncul 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'));

Fungsinya harus dengan loop di dalam loop; itu sebabnya for kedua ada di dalam yang pertama.


person Zlatko Soleniq    schedule 13.12.2012    source sumber
comment
Di regexp Anda bisa menulis 'aaabbbccc'.replace(/(.)\1+/g, "$1")   -  person Neil    schedule 14.12.2012
comment
apa yang seharusnya menjadi hasil dari unique_char('abracadabra')?   -  person Neil    schedule 14.12.2012
comment
hasilnya harus abrcd   -  person Zlatko Soleniq    schedule 14.12.2012
comment
@ZlatkoSoleniq: Bagaimana? Itu tidak sesuai dengan deskripsi Anda. Ngomong-ngomong, apa gunanya ini (atau ini pekerjaan rumah)?   -  person Bergi    schedule 14.12.2012


Jawaban (13)


Isi Set dengan karakter dan gabungkan entri uniknya:

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

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

person le_m    schedule 20.06.2016
comment
Harus meletakkan prototipe di jalur fungsi String agar dapat berfungsi. Sangat keren! String.prototype.concat(...new Set(str)) - person Austin Haws; 22.11.2016

Ubah menjadi array terlebih dahulu, lalu gunakan jawaban di sini, dan gabung kembali, seperti:

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

Semua dalam satu baris :-)

person Malcolm Holmes    schedule 01.03.2015

Mungkin terlambat tetapi tetap saja jawaban versi saya untuk posting ini:

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("");
}
person Parthasarathy K    schedule 27.07.2018

Anda dapat menggunakan ekspresi reguler dengan fungsi penggantian khusus:

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;
    });
}
person Bergi    schedule 13.12.2012

Menggunakan lodash:

_.uniq('aaabbbccc').join(''); // gives 'abc'
person Lukasz Wiktor    schedule 14.11.2016

Sesuai pertanyaan sebenarnya: "jika surat itu tidak terulang maka tidak ditampilkan"

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));
person brian buck    schedule 13.12.2012

Masalah Anda adalah Anda menambahkan unique setiap kali Anda menemukan karakter di string. Sungguh, Anda mungkin harus melakukan sesuatu seperti ini (karena Anda menentukan jawabannya harus berupa loop for yang bersarang):

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

Dalam hal ini kita hanya menambahkan karakter yang ditemukan di string ke unique jika belum ada. Ini sebenarnya bukan cara yang efisien untuk melakukan ini sama sekali... tetapi berdasarkan kebutuhan Anda, ini akan berhasil.

Saya tidak dapat menjalankan ini karena saya tidak memiliki sesuatu yang berguna untuk menjalankan JavaScript... tetapi teori dalam metode ini seharusnya berhasil.

person cottonke    schedule 13.12.2012
comment
Dia tidak menggunakan C#. JavaScript-nya. - person brian buck; 14.12.2012
comment
Komentar saya masih valid... Saya tidak punya apa pun yang berguna untuk menjalankan JavaScript. Dan saya rasa saya tidak menggunakan apa pun yang benar-benar bergantung pada bahasa. - person cottonke; 14.12.2012
comment
Kebanyakan -- Baris ini akan gagal: bool foundIt = false; Seharusnya var foundIt = false; - person brian buck; 14.12.2012
comment
ini berfungsi dengan var tetapi saya punya satu pertanyaan apa itu (!foundIT) dan dapatkah itu ditulis dengan cara yang berbeda - person Zlatko Soleniq; 14.12.2012
comment
Ini hanya mengatakan bahwa jika kita tidak menemukan karakter dalam string unique maka kita perlu menambahkannya karena ini adalah pertama kalinya kita menemukan karakter khusus ini. - person cottonke; 14.12.2012

Coba ini jika karakter duplikat harus ditampilkan satu kali, misalnya untuk 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"

Dan coba ini jika hanya karakter unik (String Bombarding Algo) yang harus ditampilkan, tambahkan kondisi "dan" lainnya untuk menghapus karakter yang muncul lebih dari satu kali dan hanya menampilkan karakter unik, misalnya untuk 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"
person jayad aadrit    schedule 17.06.2017

Berikut adalah fungsi paling sederhana untuk melakukan itu

  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;
    }
person Ahmad Adel    schedule 01.07.2017

Solusi satu baris adalah menggunakan Set. const chars = [...new Set(s.split(''))];

person Delon    schedule 07.01.2020

Berikut adalah fungsi paling sederhana untuk melakukan hal itu pt. 2

const showUniqChars = (text) => {
  let uniqChars = "";

  for (const char of text) {
    if (!uniqChars.includes(char))
      uniqChars += char;
  }
  return uniqChars;
};
person Ayrat Isakov    schedule 20.01.2020

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

cara yang lebih singkat berdasarkan jawaban @le_m

person alex_martin    schedule 20.10.2020

person    schedule
comment
Bisakah Anda memberikan penjelasan singkat tentang kode tersebut dan mengapa ini solusinya? - person crizzis; 23.06.2017