Есть ли в этой строке: return acc + cur.length;автоматически устанавливает новый акк? - PullRequest
1 голос
/ 25 сентября 2019

Вот мой код, он в основном ограничивает слова заголовка.

Интересно, почему return acc + cur.length; автоматически устанавливает новое значение acc без необходимости сохранения его в новой переменной.

Большое спасибо!

const limitRecipeTitle = (title, limit = 17) => {
    const newTitle = [];
    if (title.length > limit) {
        title.split(' ').reduce((acc, cur) => {
            if (acc + cur.length <= limit) {
                newTitle.push(cur);
            }
            return acc + cur.length;
        }, 0);
        return `${newTitle.join(' ')} ...`;
    }
    return title;
};

1 Ответ

4 голосов
/ 25 сентября 2019

"Интересно, почему эта строка: возвращать acc + cur.length; автоматически устанавливает новое значение acc без необходимости сохранять его в новом константе."

You 'повторная передача функции обратного вызова на .reduce().Метод .reduce() внутренне вызывает предоставленную вами функцию и сохраняет ее возвращаемое значение.

Эти вызовы происходят в цикле, поэтому вызов обратного вызова в следующей итерации цикла получает значение, которое вы вернули из предыдущей итерации.

Вот очень упрощенная версия .reduce метода.

Array.prototype.myReduce = function(callback, acc) {
  var i = 0;
  if (arguments.length < 2) {
    acc = this[0];
    i = 1;
  }
  while (i < this.length) {
    // The provided callback gets invoked with the current
    // value of `acc`, and then overwrites `acc` with the 
    // return value so that the next iteration gets passed
    // that new value.
    acc = callback(acc, this[i], i, this);
    i++;
  }
  return acc;
};
...