Как вывести количество повторяющихся в строке элементов и записать их число в той же строке?

Всем привет. Стоит такая задача:

  1. Из строки в которой есть дубликаты, убрать их и оставить чистый, читаемый текст. Допустим так : из 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу' получить 'мама мыла раму'
  2. В полученную строку добавить числа соответствующие повторяющимся(отсортированным) элементам. В итоге должно быть так 'ма9м6а4 м7ы7л3а2 р3а5м3у6'

Первый пункт я реализовал так :

let text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
    textSplit = text.split('');
    arr = textSplit.filter((item,index) => item !== textSplit[index - 1]);

console.log(arr.join('')); 

Получилось 'мама мыла раму'

Вопрос с реализацией второго пункта.


Ответы (3 шт):

Автор решения: Lukas

const text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
let counter = 0;
let result = [...text].reduce((acc, char, i, arr) => {
  if (char === arr[++i]) {
    counter++;
  } else {
    acc += char += counter ? counter : "";
    counter = 0;
  }
  return acc;
},"")

console.log(result)

→ Ссылка
Автор решения: Johnny Rocket

let text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';
let result = '', lastChar = text[0], count = 0;

for (let chr of text) {
  if (chr === lastChar) {
    ++count
  } else {
    result +=  lastChar + (count > 1 ? count : '')
    count = 0
    lastChar = chr
  }
} 
result +=  lastChar + (count > 1 ? count : '')

console.log(result); 

Просто счетчик воткнуть)

→ Ссылка
Автор решения: DiD

let text = 'маааааааааамммммммааааа ммммммммыыыыыыыыллллааа ррррааааааммммууууууу';

let clearText = numberText = text;
// Конструкция [...text] преобразует строку в массив
// Конструкция [...new Set(arr)] делает массив arr отфильтрованный 
//                               только уникальными значениями
[...new Set([...text])].forEach(char=> {
  // TODO требуется проверка, что в char нет спец.символов RexExp.
  // В рамках задачи не требуется, но в продакшн проверку стоит сделать
  // Это может быть дырой в безопасности.
  let rx = new RegExp(`[${char}]+`,'g');
  // Метод replace() принимает первым параметром регулярку.
  // Вторым параметром может быть строка, но в этом случае функция
  // Функция возвращает первый символ найденной строки.
  clearText = clearText.replace(rx, s => s[0]);
  // А здесь функция к первому символу прибавляет длину строки
  // (если она требуется).
  numberText = numberText.replace(rx, s => s[0] + (s.length > 1 ? s.length-1 : ''));
});

console.log(clearText);
console.log(numberText);

→ Ссылка