首先,"reduce"这个名称实际上并不会减少任何东西。在编程中,您经常会发现这种困惑/棘手的命名约定。虽然为了更好地理解,您可以假设它从多个值中获取值并将其缩小为单个值并返回。
reduce是一个高阶函数,它接受两个参数:
1. 回调函数和
2. 初始值
回调函数需要四个参数:
1. 上一个值(previousValue)
2. 当前值(currentValue)
3. 当前索引(currentIndex)
4. 数组(array)
根据我们需要解决的问题,通常情况下您只需按照两个参数传递回调函数即可。
[1, 2, 3].reduce((previousValue, currentValue, currentIndex, array) => {
}, initialValue);
现在让我们来看一个具体的例子。编写一个程序,返回数组中所有元素的总和。请先按常规方法/过程思考,然后我们将使用 reduce 来解决同样的问题。以下是编写此程序的常规方法/过程:
function sum(arr) {
let sum = 0;
for(let i = 0; i < array.length; i++) {
sum = sum + arr[i];
}
return sum;
}
所以,如果我们使用一个数组调用sum
函数,它将返回所有元素的总和。是这样吗?
是的,我们也可以使用reduce完成相同的操作。下面是代码:
[1, 2, 3, 4].reduce(function(previousValue, currentValue) {
let result = previousValue + currentValue;
return result;
}, 0);
它做的事情相同。reducer遍历数组元素,在每一步中将当前数组值添加到上一步的结果中(该结果是所有先前步骤的运行总和),直到没有更多要添加的元素为止。(引用:
这里)
在这里,
previousValue
是惯常的
sum
,而
currentValue
是惯常的
arr[i]
。
在第一次迭代中,没有
previousValue(先前计算的返回值)
- 对吗?在这种情况下,
initialValue
将被用作
previousValue
。如果没有
initialValue
,则使用索引0处的数组元素作为初始值,并从下一个元素(索引1而不是索引0)开始迭代。
您可以像这样编写程序,而无需使用额外的变量
result
:
[1, 2, 3, 4].reduce(function(previousValue, currentValue) {
previousValue += currentValue;
return previousValue;
}, 0);
更简短地说:
[1, 2, 3, 4].reduce((previousValue, currentValue) => previousValue += currentValue, 0);
希望你能理解。现在你需要写一个程序,使用reduce方法找到非空数组中的最小值(假设数组中所有元素都是正数)。
以下是示例代码:
const arr = [4, 2, 3, 1];
let result = arr.reduce((minValue, currentValue) => {
if (currentValue < minValue) {
minValue = currentValue;
}
return minValue;
});
console.log(result);
❤️ 快乐编程 ❤️