reduce()
方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值。
概念:对数组中的所有元素调用指定的回调函数。该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。
语法:
array1.reduce(callbackfn[, initialValue])
参数:
参数 | 定义 |
---|---|
array1 | 必需。一个数组对象。 |
callbackfn | 必需。一个接受最多四个参数的函数。对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。 |
initialValue | 可选。如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供。 |
返回值
通过最后一次调用回调函数获得的累积结果。
异常
当满足下列任一条件时,将引发 TypeError 异常:
备注
如果提供了 initialValue,则 reduce 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序)。如果未提供 initialValue,则reduce 方法会对从第二个元素开始的每个元素调用 callbackfn 函数。
回调函数的返回值在下一次调用回调函数时作为 previousValue 参数提供。最后一次调用回调函数获得的返回值为 reduce 方法的返回值。
不为数组中缺少的元素调用该回调函数。
注意
reduceRight 方法 (Array) (JavaScript)按降序索引顺序处理元素。
回调函数语法
回调函数的语法如下所示:
function callbackfn(previousValue, currentValue, currentIndex, array1)
可使用最多四个参数来声明回调函数。
下表列出了回调函数参数。
回调参数 | 定义 |
---|---|
previousValue | 通过上一次调用回调函数获得的值。如果向 reduce 方法提供 initialValue,则在首次调用函数时,previousValue 为initialValue。 |
currentValue | 当前数组元素的值。 |
currentIndex | 当前数组元素的数字索引。 |
array1 | 包含该元素的数组对象。 |
第一次调用回调函数
在第一次调用回调函数时,作为参数提供的值取决于 reduce 方法是否具有 initialValue 参数。
如果向 reduce 方法提供 initialValue:
如果未提供 initialValue:
修改数组对象
数组对象可由回调函数修改。
下表描述了在 reduce 方法启动后修改数组对象所获得的结果。
reduce 方法启动后的条件 | 元素是否传递给回调函数 |
---|---|
在数组的原始长度之外添加元素。 | 否。 |
添加元素以填充数组中缺少的元素。 | 是,如果该索引尚未传递给回调函数。 |
元素被更改。 | 是,如果该元素尚未传递给回调函数。 |
从数组中删除元素。 | 否,除非该元素已传递给回调函数。 |
如果单纯看概念,一看就会头晕,但是看示例demo及输出,则对reduce的作用一目了然。
example:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
//10
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},10);
//20
[1].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},20);
//21
//如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。[至少有一个值为 “ 有 ”]
[1].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
//1
[].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},2);
//2
[null].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},2);
//2
//如果出现值为Undefined,则输出NaN
[undefined].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},2);
//NaN
[1].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},undefined);
NaN
//如果数组为空并且没有提供initialValue, 会抛出TypeError [两个值都没有]
[].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
例子:将数组所有项相加
var total = [0, 1, 2, 3].reduce(function(a, b) {
return a + b;
});
console.log(total);
// total == 6
例子: 数组扁平化
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
});
console.log(flattened);
// flattened is [0, 1, 2, 3, 4, 5]