Почему reduce работает именно так?

231
18 октября 2017, 08:44

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);  

  1. При первом вызове функции reduce аргумент allNames равен {Alice: 1}. Как так получается, что элемент массива становится объектом, где свойство Alice равно 1? Почему не просто "Alice"?
  2. Почему name равно "Alice", а не "Bob"? Ведь по идее allNames, аккумулятор, равняется первому элементу массива names, а name - должен указывать на следующий?
Answer 1

В параметре для 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

READ ALSO
Ошибка: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeCon

Ошибка: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeCon

При попытке собрать проект возникает ошибка

379
js получить время

js получить время

Нужно вытащить отсюда время https://yandexcom/time/sync

309
Как записать куки на ajax странице?

Как записать куки на ajax странице?

Как записать куки на ajax странице без перезагрузки страницы?

351
Обрезать текст до символа “\”

Обрезать текст до символа “\”

Очень коротко: есть 2 формыПри изменении значения поля file в Форме №1, стоит обработчик, который это значение записывает в другое поле в Форме...

378