如何使用reduce迭代数组

时间:2019-07-18 18:41:57

标签: javascript

我一直在研究使用reduce over map的好处。主要的好处是减少具有更好的性能时间。

我的问题是,我将如何像使用map函数那样使用reduce来遍历数组?

一个例子

以下代码将结果合并为一个字符串。我如何使用reduce函数迭代此数组?

const fruits = ['pears', 'plums', 'grapes', 'apples']

console.log(fruits.reduce( (acc, fruit) => acc.concat(fruit)))

// "pearsplumsgrapesapples"

5 个答案:

答案 0 :(得分:2)

您将牺牲代码易读性一毫秒的差异,但这是这样:

['pears', 'plums', 'grapes', 'apples'].reduce(function (acc, currentFruit) {
    // Your code here
    acc.push(currentFruit);
    return acc;
 }, []);

由于reduce方法的目标是将提供的数据减少为单个值,因此必须将当前值推入数组。

最终,地图变得更好,更简单,您将无法注意到时差。

答案 1 :(得分:1)

答案 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));