JavaScript вычисленные свойства - PullRequest
2 голосов
/ 07 апреля 2020

Я слежу за функциональным программированием Джеймса Мура для начинающих с курсом JavaScript. Однако в настоящее время у меня возникают трудности с пониманием следующего кода:

const reviews = [4.5, 4.0, 5.0, 2.0, 1.0, 5.0, 3.0, 4.0, 1.0, 5.0, 4.5, 3.0, 2.5, 2.0];

const countGroupedByReview = reviews.reduce(groupBy, {});

function groupBy (acc, review){
  const count = acc[review] || 0;
  return {...acc, [review]: count + 1}
}

Хотя я понимаю, как работает метод Reduce, я пытаюсь разобраться в коде внутри функционального блока groupBy. Я считаю, что это как-то связано с именами вычисляемых свойств. Буду очень признателен за любую помощь.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 07 апреля 2020

Не думаю, что в блоке кода есть какие-либо вычисленные имена свойств. Что делает этот блок кода, так это то, что он подсчитывает количество вхождений каждой оценки в массиве. Давайте сначала пройдемся по обратному вызову с его аргументами:

Обратный вызов принимает 2 аргумента:

  • acc - это аккумулятор, который представляет собой данные, в которые будет добавляться редуктор. Сначала он определяется как пустой объект, так как второй аргумент в Array.prototype.reduce
  • review - это просто текущий элемент в массиве, который в настоящее время проходит через

Сейчас в код самого обратного вызова. Строка const count = acc[review] || 0 просто означает:

  1. Если элемент массива существует в качестве ключа в аккумуляторе, вернуть его значение
  2. Если элемент массива не существует в качестве ключа в аккумулятор, затем установите его значение на 0

. После этого вы просто увеличиваете счет на 1, потому что вы только что встретили элемент и хотите добавить его к общему количеству, сгруппированному по значение элемента массива. { ...acc, [review]: count + 1 } - это просто функция распространения объекта, которая просто означает: сохранить любую пару ключ-значение, которую я имею для аккумулятора, но объединить изменения, сделанные для конкретной пары ключ-значение.

3 голосов
/ 07 апреля 2020
{...acc, [review]: count + 1}

Здесь он распространяет acc и для текущего элемента добавляет 1 к предыдущему счету,

[1,3,3]

Например, когда вы l oop над этим массивом на первом элемент т.е. 1 groupBy вернет объект наподобие

{ 1: 1 }

Теперь на второй итерации текущий элемент равен 3, поэтому groupBy распространит предыдущий объект и, поскольку 3 didn ' t появился раньше, поэтому count = 0, возвращаемое значение groupBy будет

{ 1: 1, 3: 1}

Теперь на третьей итерации текущий элемент равен 3, поэтому groupBy распространит предыдущий возвращенный объект и для ключа 3 он добавляет 1, поэтому возвращает

{ 1: 1, 3: 2}


Простая версия может выглядеть примерно так:

const reviews = [4.5, 4.0, 5.0, 2.0, 1.0, 5.0, 3.0, 4.0, 1.0, 5.0, 4.5, 3.0, 2.5, 2.0];

const countGroupedByReview = reviews.reduce(groupBy, {});

function groupBy(acc, review) {
  acc[review] = acc[review] || 0;
  acc[review]++
  return acc
}

console.log(countGroupedByReview)
...