我使用了这两种方法,但我对这两种方法的使用感到很困惑。
有什么map
可以做但不能做的事情,reduce
反之亦然?
注意:我知道如何使用这两种方法,我质疑这些方法之间的主要区别以及我们何时需要使用。
我使用了这两种方法,但我对这两种方法的使用感到很困惑。
有什么map
可以做但不能做的事情,reduce
反之亦然?
注意:我知道如何使用这两种方法,我质疑这些方法之间的主要区别以及我们何时需要使用。
双方map
并reduce
具有作为输入数组,你定义一个函数。它们在某种程度上是互补的: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
使用数组作为输入,您可以根据获取accumulator
和current_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
,但简而言之,想想哪个会更短,最终会更好。
通常,“映射”意味着将一系列输入转换为等长的输出系列,而“减少”意味着将一系列输入转换为较少数量的输出。
人们所说的“map-reduce”通常被解释为“变换,可能并行,串行组合”。
当您“映射”时,您正在编写一个将x
withf(x)
转换为一些新值的函数x1
。当您“减少”时,您正在编写一些g(y)
接受数组y
并发出数组的函数y1
。他们处理不同类型的数据并产生不同的结果。
该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