Уже видел ответы на вопрос подсчёта повторений в массиве, но не понятно, что конкретно делает 2строка acc[el] = (acc[el] || 0) + 1;
var result = [1, 3, 4, 1, 1, 3, 4, 5].reduce(function(acc, el) {
acc[el] = (acc[el] || 0) + 1;
return acc;
}, {});
Это (acc[el] || 0) выражение в скобках вернёт acc[el], если оно эквивалентно true, или 0 в ином случае.
Часто используется в js для присвоения значения по-умолчанию. (var obj = o || {} - если o равен undefined, null, false и тд, то в переменную obj пойдёт {} пустой объект).
Или вот:
alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'
Первый параметр, который эквивалентен логическому true, и будет выведен.
Здесь есть несколько хороших ответов на эту тему.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости