var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (allNames, name) {
if (name in allNames) {
allNames[name]++;
}
else {
allNames[name] = 1;
}
return allNames;
}, {});
console.log(countedNames);
{Alice: 1}. Как так получается, что элемент массива становится объектом, где свойство Alice равно 1? Почему не просто "Alice"?"Alice", а не "Bob"? Ведь по идее allNames, аккумулятор, равняется первому элементу массива names, а name - должен указывать на следующий?В параметре для reduce, который задает начальное значение стоит {}, т.е. объект. Поэтому все аккумулируется в объект. Когда объект пустой (на первой итерации) срабатывает
allNames[name] = 1;
здесь в allNames создается поле с именем по содержимому name и это поле инициализируется значением 1. Получается, что после обработки первого элемента массива allNames становится
{
Alice: 1,
}
Далее добавляется Bob и AllNames становится
{
Alice": 1,
Bob: 1,
}
и так до последнего элемента исходного массива. На последнем элементе срабатывает ветка else в
if (name in allNames) {
и выполняется
allNames[name]++;
в результате чего поле Alice принимает значение равное 2
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости