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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При попытке собрать проект возникает ошибка
Как записать куки на ajax странице без перезагрузки страницы?
Очень коротко: есть 2 формыПри изменении значения поля file в Форме №1, стоит обработчик, который это значение записывает в другое поле в Форме...