如何在reduce函数中映射参数?

时间:2019-07-01 03:36:46

标签: javascript arrays ecmascript-6

MDN如下定义reduce():

reduce()方法在数组的每个元素上执行一个reducer函数(由您提供),从而产生单个输出值。

我们不理会任何事情,只需分析以下语句的语法:

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. reducer是一个具有两个参数并返回其总和的函数
  2. reducer在数组的每个元素上执行,但是“数组的每个元素”仅是一个参数,为什么我可以假定SUM是另一个参数并缓存在某个位置,等待下一个添加操作?为什么我可以假设reduce会在最后返回总和?

有人可以回答这些问题吗?来自其他语言背景的人C里面也有功能概念。我经常对Javascript的语法感到困惑。

这就是我看到时变得更加困惑的方式:

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

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

再次,因为MDN认为,reduce()方法在数组的每个元素上执行reducer函数(由您提供),从而产生单个输出值。

仅这次

减速器:(xs,f)=> f(xs)

累加器:[1、2、3]

array1:管道

那么我们如何用英语解释类似于我们第一个例子的行为?

1 个答案:

答案 0 :(得分:0)

  

reducer在数组的每个元素上执行,但是“数组的每个元素”仅是一个参数,为什么我可以假设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(或任何其他函数)并没有限制该函数可以被调用的次数。

  

为什么我可以假设reduce会在最后返回总和?

这就是方法的定义方式-像上面的实现一样,累加器(或accum)在每次迭代时都被重新分配,并传递给下一次对回调的调用。

该方法实际上不是用浏览器的浏览器本机实现来编写的,但其功能(大部分)是相同的。

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调用求和的值。