Вы можете сделать следующее;
var str = 'bbbabccc',
res = [...str].reduce((r,c,i) => (r[r.length-1][0] === c || !i) ? (r[r.length-1] += c, r)
: r.concat(c), [""])
.reduce((r,s) => r + s[0] + (s.length-1 ? s.length : ""), "");
console.log(res);
У нас есть два .reduce()
каскадных здесь, но сначала приятно знать, что [...str]
превращается в ["b", "b", "b", "a", "b", "c", "c", "c"]
.
Первый .reduce()
уменьшит его до массива строк, таких как ["bbb", "a", "b", "ccc"]
.
Второй .reduce()
еще больше уменьшит его до результата. Внутреннюю механику каждого редуктора решать вам.
Однако, как подсказка, имейте в виду, что оператор запятой ,
, как в (r[r.length-1] += c, r)
, берет последний элемент массива r
(здесь аккумулятор), добавляет c
к его концу и возвращает r
.