数组的reduce方法

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
  • callback 执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数

    • accumulator:累计器累计回调的返回值,它是上一次调用回调时返回的累积值,或initialValue
    • currentValue:数组中正在处理的元素
    • index(可选):数组中正在处理的元素的索引。如果指定了initialValue,则起始索引为0,否则从1起始
    • array(可选):调用reduce的数组
  • initialValue(可选):第一次调用callback的第一个参数。注意:在没有初始值空数组上调用reduce会报错

返回值:返回函数累积处理的结果

[1, 2, 3, 4].reduce(
    (accumulator, currentValue, index, array) => {
        console.log(accumulator, currentValue, index, array)
        return accumulator + currentValue
    }
)
// 1 2 1 (4) [1, 2, 3, 4]
// 3 3 2 (4) [1, 2, 3, 4]
// 6 4 3 (4) [1, 2, 3, 4]
[1, 2, 3, 4].reduce(
    (accumulator, currentValue, index, array) => {
        console.log(accumulator, currentValue, index, array)
        return accumulator + currentValue
    }
, 10)
// 10 1 0 (4) [1, 2, 3, 4]
// 11 2 1 (4) [1, 2, 3, 4]
// 13 3 2 (4) [1, 2, 3, 4]
// 16 4 3 (4) [1, 2, 3, 4]
// 1.没有初始值的空数组调用reduce,会报错
[].reduce((accumulator, currentValue, index, array) => accumulator + currentValue)
// VM698:1 Uncaught TypeError: Reduce of empty array with no initial value

// 2.数组只有一个元素且没有初始值或者只有初始值的空数组,不会执行callback
[3].reduce((accumulator, currentValue, index, array) => accumulator + currentValue)
[].reduce((accumulator, currentValue, index, array) => accumulator + currentValue, 3)
// reduce() 没有初始值
var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback ); // NaN
[ { x: 2 }, { x: 22 }            ].reduce( maxCallback ); // 22
[ { x: 2 }                       ].reduce( maxCallback ); // { x: 2 }
[                                ].reduce( maxCallback ); // TypeError
// 所以最好指定初始值
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( 
    (accumulator, currentValue) => Math.max(accumulator, currentValue.x)
    , 0 
);  // 42

results matching ""

    No results matching ""