Как параметры отображаются в функции сокращения? - PullRequest
0 голосов
/ 01 июля 2019

MDN определяет lower () следующим образом:

Метод redu () выполняет функцию редуктора (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение.

Давайте не будем принимать что-либо как должное, а просто проанализируем синтаксис следующих операторов:

const array1 = [1, 2, 3, 4];
const reducer = (y, x) => y + x;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer));
// expected output: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce(reducer, 5));
  1. редуктор - это функция, которая принимает два параметра и возвращает их сумму
  2. редуктор выполняется для каждого элемента массива, но «каждый элемент массива» является только ОДНЫМ параметром, почему я могу предположить, что SUM является другим параметром и кэшируется где-то в ожидании следующей операции добавления? и почему я могу предположить, что сокращение возвращает сумму в конце?

Может ли кто-нибудь ответить на эти вопросы? От кого-то из других языков, например С, который также имеет концепцию функции. Меня часто смущает синтаксис Javascript.

и вот как я запутываюсь, когда вижу:

const pipeline = [
  array => { array.pop(); return array; },
  array => array.reverse()
];

pipeline.reduce((xs, f) => f(xs), [1, 2, 3]);

потому что, опять же, согласно MDN, метод redu () выполняет функцию редуктора (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение.

только на этот раз,

редуктор: (xs, f) => f (xs)

аккумулятор: [1, 2, 3]

массив1: конвейер

тогда как мы объясним его поведение аналогично нашему первому примеру на английском?

1 Ответ

0 голосов
/ 01 июля 2019

редуктор выполняется для каждого элемента массива, но «каждый элемент массива» является только ОДНЫМ параметром, почему я могу предположить, что SUM является другим параметром и кэшируется где-то в ожидании следующей операции добавления?

Предоставленный обратный вызов вызывается несколько раз, по одному разу для каждого элемента в массиве (или для length - 1 раз, если начальное значение не указано).Вы можете легко реализовать это самостоятельно:

const array1 = [1, 2, 3, 4];
const reducer = (y, x) => y + x;

Array.prototype.myReduce = function(callback, initialValue) {
  let accum = initialValue === undefined
    ? this.shift()
    : initialValue;
  for (let i = 0; i < this.length; i++) {
    accum = callback(accum, this[i], i, this);
  }
  return accum;
}
// 1 + 2 + 3 + 4
console.log(array1.myReduce(reducer));
// expected output: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.myReduce(reducer, 5));

Только то, что вы передаете одну функцию в .reduce (или в любую другую функцию), не накладывает ограничения на то, сколько раз эта функцияможно вызвать.

и почему я могу предположить, что при уменьшении возвращается сумма в конце?

Так определен метод - как в приведенной выше реализации,аккумулятор (или accum) переназначается для каждой итерации и передается следующему вызову обратного вызова.

Собственная реализация метода в браузере на самом деле не написана на Javascript, как описано выше, но его функциональностьто же самое (по большей части).

pipeline работает так же.Для каждого предоставленного элемента массива аккумулятор переназначается, и следующий элемент вызывается с новым аккумулятором.Здесь есть массив вызываемых функций, и возвращаемое значение каждой функции используется в качестве следующего аккумулятора, а значение, возвращаемое последним вызовом функции, - это то, к чему разрешается весь вызов .reduce.

const pipeline = [
  array => { array.pop(); return array; },
  array => array.reverse()
];

pipeline.reduce((xs, f) => f(xs), [1, 2, 3]);

Элемент 1: начальное значение (аккумулятор) - [1, 2, 3].Подключившись к array => { array.pop(); return array; }, вы .pop() получите его последнее значение (3, в результате чего [1, 2], затем вы вернете массив.

Элемент 2: Накопитель (возвращаемое значение последней итерации) равен [1, 2]Подключите его к array => array.reverse(), и вы получите тот же массив, в обратном порядке: [2, 1].

В массиве больше нет элементов, поэтому это [2, 1] - это значение, которое в целом reduceВызов оценивается в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...