map和reduce的主要区别

IT技术 javascript dictionary reduce
2021-03-10 11:27:02

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

有什么map可以做但不能做的事情,reduce反之亦然?

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

6个回答

来源

双方mapreduce具有作为输入数组,你定义一个函数。它们在某种程度上是互补的:map不能为多个元素的数组返回单个元素,而reduce将始终返回您最终更改的累加器。

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

使用数组作为输入,您可以根据获取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)

现在,看看这些,显然第二个实现看起来更好,而且更短。通常您会选择更清洁的解决方案,在这种情况下是map. 当然,你可以用 来做reduce,但简而言之,想想哪个会更短,最终会更好。

console.log([1, 2, 3, 4, 5].reduce(function (acc, current) { acc.push( current = current*current); return acc; }, []))
2021-04-28 11:27:02
在选择使用哪个时,意图是关键。如果两者都可以达到相似的结果,并且由于性能差异可以忽略不计,请使用符合您意图的函数,就像 Tadman 在下面提到的“当您“映射”时,您正在编写一个函数,将 x 与 f(x) 转换为一些新的值 x1。当你“减少”时,你正在编写一些函数 g(y),它接受数组 y 并发出数组 y1"。
2021-05-08 11:27:02
@NishantDixit 你是什么意思你可以做同样的事情reduce你不能,这就是我试图在这些例子中展示的。
2021-05-11 11:27:02
我在下面的注释中添加了 reduce 方法,它计算给定的平方并返回新数组。
2021-05-13 11:27:02
好的,我看到了你的 Map 示例,但我可以用 reduce 函数做同样的事情,哪个是好的,为什么?使用reduce 创建新数组或使用map 修改现有数组。
2021-05-18 11:27:02

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

在此处输入图片说明

图片来源是什么?
2021-05-12 11:27:02

通常,“映射”意味着将一系列输入转换为等长的输出系列,而“减少”意味着将一系列输入转换为较少数量的输出。

人们所说的“map-reduce”通常被解释为“变换,可能并行,串行组合”。

当您“映射”时,您正在编写一个将xwithf(x)转换为一些新值的函数x1当您“减少”时,您正在编写一些g(y)接受数组y并发出数组的函数y1他们处理不同类型的数据并产生不同的结果。

实际上,两者都是独立于数据类型的,而不是“它们处理不同类型的数据......”对吗?
2021-05-08 11:27:02

map()函数通过在输入数组中的每个元素上传递一个函数来返回一个新数组。

这与以reduce()相同方式接受数组和函数不同,但该函数接受2输入 - 累加器和当前值。

所以reduce()可以像map()如果你总是.concat在累加器上使用函数的下一个输出。然而,它更常用于减少数组的维数,因此要么取一维并返回单个值,要么展平二维数组等。

让我们一一看看这两个。

地图

Map 接受一个回调并对数组中的每个元素运行它,但它的独特之处在于它根据您现有的数组生成一个新数组

var arr = [1, 2, 3];

var mapped = arr.map(function(elem) {
    return elem * 10;
})

console.log(mapped); // it genrate new array

减少

数组对象的 Reduce 方法用于将数组减少为一个值

var arr = [1, 2, 3];

var sum = arr.reduce(function(sum, elem){
    return sum + elem;
})

console.log(sum) // reduce the array to one single value