尝试理解.reduce()的回调函数中的参数

时间:2019-05-28 12:49:12

标签: javascript arrays reduce

我正在尝试学习JS,并且对reduce()有一些疑问 我想知道如何知道此函数需要哪些参数以及应该如何调用它们。

此参数是否与函数外部的任何数据或数组连接。

或此参数提议仅可在回调的此本地上下文中用作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 :(得分:0)

它们仅在回调内部可用,但是显然它们不是常量,因为total随每个刻度线而变化。 reduce如下所示:

  1. 累加器初始化为0。
  2. 首先滴答,回调函数获取累加器的当前值(其名称为total,但此名称完全是任意的),0和一个元素:对象(company),其中,除其他外,开始= 1981和结束=2004。该函数返回total + company.end - company.start的值(0 + 2004-1981)。 2a。回调返回的值成为累加器的新值。现在是23。
  3. 第二个滴答,回调函数将23作为累加器,将{ start: 1992, end: 2008 }作为当前元素。其他所有步骤均如上所述。

...

最后一个滴答:最后一次执行回调所返回的值是companies.reduce(/*...*/)表达式的返回值。

答案 1 :(得分:0)

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)通常也称为“ item”。只是执行回调的 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)是累加器的 starting 值(或{ {1}})。并非严格要求使用它,但在许多情况下它很有用-您通常要从 some 值开始。如果不提供此参数,则第一次运行total时,它将从数组中的 second 值开始,并将累加器设置为第一个:

.reduce()

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