Сокращение Попытка понять параметры в функции обратного вызова .reduce () - PullRequest
0 голосов
/ 28 мая 2019

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

связаны ли эти параметры слюбые данные или массив вне функции.

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

Спасибо за ваше время

Просто пытаюсь понять .reduce ()

const companies= [
  {name: "Company One", category: "Finance", start: 1981, end: 2004},
  {name: "Company Two", category: "Retail", start: 1992, end: 2008},
  {name: "Company Three", category: "Auto", start: 1999, end: 2007},
  {name: "Company Four", category: "Retail", start: 1989, end: 2010},
  {name: "Company Five", category: "Technology", start: 2009, end: 2014},
  {name: "Company Six", category: "Finance", start: 1987, end: 2010},
  {name: "Company Seven", category: "Auto", start: 1986, end: 1996},
  {name: "Company Eight", category: "Technology", start: 2011, end: 2016},
  {name: "Company Nine", category: "Retail", start: 1981, end: 1989}
];

const totalYears = companies.reduce((total, company) => total + (company.end - company.start), 0);


console.log(totalYears);

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Параметры reduce относятся к массиву. Вот простая перезапись, чтобы показать, что эффективно происходит:

companies.reduce((total, company) => total + (company.end - company.start), 0);

также может быть выражено как:

//first parameter to the callback
let total;

//value supplied as the second parameter to `.reduce()`
total = 0;

//the second parameter to the callback
for(let company of companies) { //this is the loop `.reduce` does for you

  //this variable does not show up in your code but is here for clarity
  let temp;

  //this is the body of your `.reduce()` callback
  temp = total + (company.end - company.start)

  //this would be `reduce` handing `total` to the next invocation
  total = temp;
}

Это упрощение, но оно может помочь понять, что происходит.

Параметры, которые вы определяете, могут быть названы произвольно, но они будут служить той же цели

  • первый параметр для обратного вызова (total, в вашем случае) часто называют «аккумулятором» - это общий термин, и, честно говоря, сначала очень запутанный, но все, что он делает, это возвращает last результат обратного вызова. Итак, если вы пытаетесь суммировать все элементы массива, это может быть ваш промежуточный итог, если вы пытаетесь найти наименьший элемент, он может просто содержать текущий наименьший элемент.
  • второй параметр для обратного вызова (company, в вашем случае) также часто называют «элементом». Это просто элемент current , для которого выполняется обратный вызов.

Стоит отметить, что обратный вызов также вызывается с большим количеством аргументов. Вам решать, хотите ли вы использовать их или нет - часто они не нужны:

  • третий параметр - индекс текущего элемента
  • четвертый параметр - весь массив

const sample = ["h", "e", "l", "l", "o"];

//a simple concatenation to illustrate how the parameters work
const output = sample.reduce((accumulator, item, index, array) => {
  console.log(accumulator, item, index, array);
  
  return accumulator + item;
})

console.log("output is:", output);
  • второй параметр до .reduce() не для обратного вызова (0 в вашем случае) - это начальное значение аккумулятора (или total здесь). Это не строго необходимо, но полезно во многих случаях - обычно вы хотите начать с некоторого значения. Если вы не предоставите этот аргумент, то при первом запуске .reduce() он будет начинаться со значения second в массиве и будет устанавливать аккумулятор на первое значение:

let run = 1;
//no initial value set
["a", "b", "c"].reduce((accumulator, item) => {
  console.log(run++, accumulator, item);
})

let run = 1;
//with initial value set
["a", "b", "c"].reduce((accumulator, item) => {
  console.log(run++, accumulator, item);
}, "some initial value")
0 голосов
/ 28 мая 2019

Они доступны только внутри обратного вызова, но, очевидно, они не являются константами, поскольку total мутирует с каждым тиком. Это reduce выглядит так:

  1. Аккумулятор инициализируется до 0.
  2. Первый тик, обратный вызов получает текущее значение аккумулятора (он называется total, но это имя совершенно произвольно), 0 и элемент: объект (company), с, среди прочего, начало = 1981 и конец = 2004. Функция возвращает значение total + company.end - company.start (0 + 2004 - 1981). 2а. Значение, возвращаемое обратным вызовом, становится новым значением аккумулятора. Сейчас 23.
  3. Второй тик, обратный вызов получает 23 в качестве аккумулятора и { start: 1992, end: 2008 } в качестве текущего элемента. Все остальное происходит так, как указано выше.

...

Последний тик: значение, возвращаемое последним выполнением обратного вызова, является возвращаемым значением выражения companies.reduce(/*...*/).

...