Javascript: Визначте, чи є всі символи в рядку унікальними, а якщо ні, видаліть дублікати символів

Have an array set up with a[letter][occurences], but struggling with looping through this array, to check for occurences > 1 and removing the ones that are.

function charFreq(s) {
    var i, j;
    var a = new Array();

    for (j = 0; j < s.length; j++) {
        for (i = 0; i < a.length; i++) {
            if (a[i][0] == s[j]) {
                a[i][1]++;
                break;
            }
        }
        if (i == a.length) {
            a[i] = [s[j], 1];
        }
    }
    return a[i][0];
}
document.write(charFreq("insert string here"));

Це неприємність, з якою я прийшов до цих пір:

function check(str) {
    var c;
    for (c=0; c < a.length; c++) {
        if(a[c][1] == 1) {
            return true;
            break;
        } else {
            return false;
        }
    }
}
4

7 Відповіді

Використання ES6 Set:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

// :: unique = Array|string => Array
const unique = xs => [...new Set(xs)]

const dedupe = str => unique(str).join('')

console.log(
  unique('foo'),//=> ['f', 'o']
  dedupe('foo'),//=> 'fo'
)
</div> </div>
3
додано
Це було саме те, що я шукав, простий і легкий "Набір" :)
додано Автор Jacobi, джерело

Не робіть цього так.

function noDups( s ) {
  var chars = {}, rv = '';

  for (var i = 0; i < s.length; ++i) {
    if (!(s[i] in chars)) {
      chars[s[i]] = 1;
      rv += s[i];
    }
  }

  return rv;
}

alert(noDups("Shoe fly pie, and apple pan dowdy"));//Shoe flypi,andw

Оскільки довжина вашого рядка збільшується, ваш код стає повільним фактором, приблизно рівним квадрату довжини рядка.

1
додано
@JSNewb ця функція повертає новий масив. Він може бути змінений, щоб також повернути карту, а карта міститиме кількість. (Це також може бути перетворено в масив, якщо ви хочете.)
додано Автор Pointy, джерело
якщо б я мав скласти масив для дублікатів, щоб бути підрахованим окремо, чи буде він поміщений в іншому операторі? Або я хочу створити нову функцію?
додано Автор JSNewb, джерело

Ось короткий спосіб.

str = str.split('').filter(function(v,i,self){
  return self.indexOf(v) == i;
}).join('');
0
додано
@Сойнтіте: так. Не найефективніший я думаю, але в який момент ви повинні почати хвилюватися насправді?
додано Автор elclanrs, джерело
Красиво, але це тільки "швидко" в плані введення його в :-)
додано Автор Pointy, джерело
Ну, 100-символьний рядок, як 100 разів повільніше, ніж майже лінійний алгоритм, який використовує карту. Може бути, не велика справа; залежить від ситуації.
додано Автор Pointy, джерело

Я не бачу версії сплайс , тому ось така:

function uniqueChars(s) {
  var s = s.split('');
  var c, chars = {}, i = 0;

  while ((c = s[i])) {
    c in chars? s.splice(i, 1) : chars[c] = ++i;
  }
  return s.join('');
}
0
додано

Це передбачає лише буквені символи, а верхній регістр не дорівнює нижньому регістру.

function uniqueChars(string){
    var i= 0, L= string.length, ustring= '', next;
    while(i

/ * повернуте значення: (String) Thequickrdfoxjmpsvtlazybwng * /

Це повертає будь-який унікальний персонаж -

function uniqueArray(array){
    return array.filter(function(itm, i, T){
        return T.indexOf(itm)== i;
    });
}
var s1= 'The quick red fox jumps over the lazy brown dog.';
uniqueArray(s1.split('')).join('');

/ * повернуте значення: (String) Quickrdfoxjmpsvtlazybwng. * /

0
додано
function RemoveDuplicateLetters(input) {
    var result = '', i = 0, char = '';
    while (i < input.length) {
        char = input.substring(i, i+1);
        result += char;
        input = input.replace(char,'');
    }
    return result;
}
0
додано
Скоріше, ніж підрядка , розгляньте < i> charAt . Крім того, в деяких браузерах оператор + = є повільним, додавання в масив може бути набагато швидшим (і не набагато повільніше в інших браузерах).
додано Автор RobG, джерело

Щоб видалити дублікати символів з рядка, можна скористатись наступною функцією, яка зробила користувача @Cerbrus

function find_unique_characters( string ){
    var unique='';
    for(var i=0; i

Якщо ви хочете лише повернути символи, які з'являються один раз в a   string, перевірте, чи їх останній випадок знаходиться в тій же позиції, що й   їх перша подія.

     

Ваш код повертає всі символи в рядку принаймні один раз   а не тільки повернення символів, які трапляються не частіше одного разу

Посилання на потоку стекового потоку Видалити дублікати символів з рядка The

0
додано
Це, ймовірно, працюватиме, але це також алгоритм n ^ 2 .
додано Автор Pointy, джерело
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram