地图和减少的主要区别

2022-08-30 04:55:17

我使用了这两种方法,但我对这两种方法的用法感到非常困惑。

是什么可以做但不能做,反之亦然?mapreduce

注意:我知道如何使用这两种方法,我质疑这些方法之间的主要区别以及何时需要使用。


答案 1

两者都具有作为输入的数组和您定义的函数。它们在某种程度上是互补的:不能为多个元素的数组返回一个元素,而将始终返回您最终更改的累加器。mapreducemapreduce

map

使用迭代元素,并为每个元素返回所需的元素。map

例如,如果您有一个数字数组并希望获取它们的平方,则可以执行以下操作:

// A function which calculates the square
const square = x => x * x

// Use `map` to get the square of each number
console.log([1, 2, 3, 4, 5].map(square))

reduce

使用数组作为输入,您可以根据回调函数(第一个参数)获得一个单个元素(假设一个对象,或一个数字,或另一个数组),该函数获取 and 参数:accumulatorcurrent_element

const numbers = [1, 2, 3, 4, 5]

// Calculate the sum
console.log(numbers.reduce(function (acc, current) {
  return acc + current
}, 0)) // < Start with 0

// Calculate the product
console.log(numbers.reduce(function (acc, current) {
  return acc * current
}, 1)) // < Start with 1

当您可以对两者做同样的事情时,您应该选择哪一个?试着想象一下代码的样子。对于提供的示例,您可以使用以下命令计算正方形数组,如您所提到的:reduce

// Using reduce
[1, 2, 3, 4, 5].reduce(function (acc, current) {
    acc.push(current*current);
    return acc;
 }, [])

 // Using map
 [1, 2, 3, 4, 5].map(x => x * x)

现在,看看这些,显然第二个实现看起来更好,而且更短。通常你会选择更干净的解决方案,在这种情况下是 。当然,您可以使用 来完成,但简而言之,请考虑哪个会更短,最终会更好。mapreduce


答案 2

我想这张图片会回答你关于这些高阶函数之间的区别

enter image description here