Вы передаете анонимную функцию и пустой объект методу уменьшения. Если вы посмотрите на документы на MDN для уменьшения: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Вы можете видеть, что он принимает функцию обратного вызова и начальное значение. В этом случае вы передаете пустой объект {}
в качестве начального значения (см. От второй до последней строки)
Метод reduce
затем «применяет функцию к аккумулятору и каждому значению массива (слева направо) чтобы уменьшить его до одного значения."
Это одно значение начинается как пустой объект, а затем свойства, добавленные получить и увеличивается в этом объекте на основе условной логики в теле функции обратного вызова
Ваша линия:.
allNames[name] = 1
служит для создания свойства с именем name
и присваивает свойству значение 1.
Эта линия:
allNames[name] += 1;
Простая установка существующего объекта.
Я хотел бы далее предположить, что пример кода не хватает форматирование, которое будет дополнительно уточнить код:
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var obj = {};
var countedNames = names.reduce(function(allNames, name) {
if (name in allNames) {
allNames[name]++;
} else {
allNames[name] = 1;
}
return allNames;
}, obj);
console.log(countedNames);
Объект буквального должен иметь свойства, чтобы присвоить значения. Ваш ожидаемый результат недействителен javascript – charlietfl
Поместите 'var allNames = {}' вверху и измените это: 'names.reduce (function (allNames, name) {...' на это: 'names.forEach (function (name) {... ', и это в основном то же самое. Главное отличие состоит в том, что' .reduce() 'передает возвращаемое вами значение из обратного вызова обратно в обратный вызов на следующей итерации. –