Как сложить количество символов
Экспериментирую со строками и встрял в тупик как вывести в консоль не сам символ, а количество (подсчет) его повторений. Сейчас консоль выводит d, m, s, f, а как вывести 3, 3, 3, 2? Пробовал свойство length, но тогда выводит 1.
function countFig(str) {
let figure = '';
let figureCount = 0;
let result = '';
for (const item of str) {
if (figure === item) {
result += `${figure}${figureCount}`;
}
figure = item;
figureCount = item.length //вот здесь я не понимаю как подсчитать количество повторяющихся символов
}
return result;
}
console.log(countFig('dddmmmsssff'));
Ответы (2 шт):
Автор решения: Igor
→ Ссылка
function countFig(str) {
const lookup = {};
for (const item of str) {
lookup[item] = (lookup[item] || 0) + 1;
}
return Object.keys(lookup).map(k => k + lookup[k]).join('');
}
console.log(countFig('dddmmmsssff'));
Автор решения: Dmitry Lobanov
→ Ссылка
Только поменяв выделеную строчку не получится. В результат нужно добавлять строку, только если символ поменялся. Например так:
function countFig(str) {
if (str.length === 0) {
return '';
}
let result = '';
let prev = str[0];
let count = 1;
// Перебираем все символы, кроме первого. Он уже учтен в prev
for (const curr of str.slice(1)) {
// Если предыдущий и текущий символы отличаются,
// то добавляем в результат и сбрасываем счетчик
// иначе инкрементируем счетчик
if (prev !== curr) {
result += `${prev}${count}`;
count = 1;
} else {
count++;
}
prev = curr;
}
// последний символ не будет учтен в цикле, исправляем это
result += `${prev}${count}`;
return result;
}
console.log(countFig('dddmmmsssff'));
Можно также решить с помощью HashMap. Igor уже показал как это сделать.