var arr = ['a','a','b','b','c','d','d','e','f'];
arr.reduce((a,c,i) => (c == arr[i-1] ? a[a.length-1]+=c : a.push(c), a), [])
arr.reduce((a, c, i) => {
if (c == arr[i - 1]) {
a[a.length - 1] += c;
} else {
a.push(c);
}
return a;
}, []);
// создаем массив со значениями
var arr = ['a','a','b','b','c','d','d','e','f'];
// перебираем все значения массива с помощью reduce (позволяет на протяжении всего перебора аккумулировать результат обработки каждого элемента)
arr.reduce(
// методу reduce передается стрелочная функция, которая будет вызвана для каждого элемента массива
// данная функция принимает параметры:
// a - аккумулятор (то что вернула данная функция при ее вызове для предыдущего элемента)
// c - текущий элемент массива
// i - индекс текущего элемента массива
(a,c,i) =>
// тело стрелочной функции (не заключено в фигурные скобки, а значит это выражение которое вернет функция)
(
c == arr[i-1] ? // если текущий элемент равен предыдущему
a[a.length-1]+=c : // то добавить его к последнему элементу
a.push(c) // иначе вставить его в конец аккумулятора
, // читаем про оператор запятая в ответе от @rockon404
a // вернуть аккумулятор
),
[] // говорим методу reduce что аккумулятор у нас массив (первый элемент в качестве а получит []
)