我一直在研究使用reduce over map的好处。主要的好处是减少具有更好的性能时间。
我的问题是,我将如何像使用map函数那样使用reduce来遍历数组?
一个例子
以下代码将结果合并为一个字符串。我如何使用reduce函数迭代此数组?
const fruits = ['pears', 'plums', 'grapes', 'apples']
console.log(fruits.reduce( (acc, fruit) => acc.concat(fruit)))
// "pearsplumsgrapesapples"
答案 0 :(得分:2)
您将牺牲代码易读性一毫秒的差异,但这是这样:
['pears', 'plums', 'grapes', 'apples'].reduce(function (acc, currentFruit) {
// Your code here
acc.push(currentFruit);
return acc;
}, []);
由于reduce
方法的目标是将提供的数据减少为单个值,因此必须将当前值推入数组。
最终,地图变得更好,更简单,您将无法注意到时差。
答案 1 :(得分:1)
看一下有关reduce的论文:https://hackernoon.com/javascript-array-reduce-50403c421968
答案 2 :(得分:1)
reduce函数确实遍历数组,因为它旨在通过应用函数将所有数组项减少为单个值。
map函数也对数组进行迭代,以便将数组元素投影到通过应用提供的函数计算出的值。
这两个函数之间的区别在于,它们出于不同的目的在数组上进行迭代。 Reduce用于计算单个值,map用于将每个数组项投影到一个新值。
在两种情况下您都无法说出计算复杂性,因为您正在传递回调,并且您不知道该回调将要做什么。因此,计算复杂度取决于回调函数。
答案 3 :(得分:1)
您可以传递一个空数组作为化简函数累加器的初始值,然后在化简函数的正文中,可以附加到acc
后面,该QTableWidget
现在将成为一个数组并执行条件逻辑。
答案 4 :(得分:1)
map
很简单。它在输入数组的每个元素上调用函数,并返回一个包含相应函数结果的新数组。
result = array.map(f)
等同于
result = [f(array[0], 0, array), f(array[1], 1, array), f(array[2], 2, array), ...]
如果要以自定义方式合并每次迭代的结果以产生一个结果,则使用reduce
。该函数有两个参数-第一个是上一次迭代的返回值,第二个是迭代中的当前元素。
result = array.reduce(f, init)
等同于
temp1 = f(init, array[0], 0, array);
temp2 = f(temp1, array[1], 1, array);
temp3 = f(temp2, array[2], 2, array);
...
result = f(tempN, array[N], N, array);
如果不提供初始值参数,则第一行变为
temp1 = array[0];
其余的都一样。
如果实际上不需要新结果,则只想在每个数组元素上执行一些代码,则使用forEach()
。就像map
,但不收集结果。如果要在新行上记录每个数组元素,请执行以下操作:
array.forEach(el => console.log(el));