1)
let arr = str.split(' ');
Возьмет строку, в данном случае
'aa bb cc aa bb aa'
, разобьет на части используя пробел как разделитель. В результате получим:
let arr = ['aa', 'bb', 'cc', ' aa', 'bb', 'aa']
2) Следующий кусок кода просто произведет подсчет одинаковых частей.
return arr.reduce((acc, rec, index) => {
return (typeof acc[rec] !== 'undefined')
? { ...acc, [rec]: acc[rec] + 1 }
: { ...acc, [rec]: 1 }
}, {});
Рассмотрим его подробнее. Начнем с аргументов:
acc – последний результат вызова функции, он же «промежуточный результат».
rec – текущий элемент массива, элементы перебираются по очереди слева-направо.
index – номер текущего элемента.
Что собственно происходит:
-
typeof acc[rec] !== 'undefined'
проверит есть ли в объекте 'acc' ключ 'rec'.
- и если мы уже встречали такой( например когда "aa", но уже во второй раз ), тогда изменить значение этого ключа прибавив 1.
{ ...acc, [rec]: acc[rec] + 1 }
- если же такого ключа еще не было, то создадим его со значением 1, ибо он в первый раз попался
{ ...acc, [rec]: 1 }