@antbelogurov

Как найти первый уникальный символ в строке?

Есть строка.
Надо чтобы возвращало первый встречающийся уникальный символ.
Если таких нет или массив пустой, то надо вернуть пустую строку.

Я сделал так, но кажется, что сильно замудренно.
И как вернуть, если отсутствуют уникальные значения, не пойму.

function firstNonRepeatingLetter(s) {
    if (s !== '' && s !== null) {
        str = s.split('').reduce((acc, el) => {
            acc[el] = (acc[el] || 0) + 1;
            return acc;
        }, {})
        for (let key in str) {
            if (str[key] == 1) {
                return key
            }
        }
    } else {
        return ''
    }
}

console.log(firstNonRepeatingLetter('a'));
console.log(firstNonRepeatingLetter(''));
console.log(firstNonRepeatingLetter('stress'));
console.log(firstNonRepeatingLetter('moonmn'));
  • Вопрос задан
  • 1862 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Регистр учитываем? Да:

const firstNonRepeatingLetter = str =>
  [...str].find((n, i, a) => a.indexOf(n) === a.lastIndexOf(n)) || '';

Нет:

const firstNonRepeatingLetter = str =>
  str.charAt(Array
    .from(str.toLowerCase())
    .findIndex((n, i, a) => a.indexOf(n) === a.lastIndexOf(n))
  );
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Aetae
@Aetae Куратор тега JavaScript
Тлен
По второму вопросу: убери else в конце, пусть возвращает '' в любом случае, раз не вернуло значение ранее.
По первому: нормальное "прямое" решение. Для большинства задач достаточное. Мб есть какой-то хитрый алгорим, более оптимальный, но я его не знаю.)
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
const firstNonRepeatingLetter = str => Object.entries(
  Array.prototype.reduce.call(str, (acc, char) => ({
    ...acc,
    [char]: (acc[char] || 0) + 1
  }), {})
).filter(([,count]) => count === 1)[0]?.[0] || '';
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы