reduce
- 定义:对数组中的每个元素执行一次传入的
reducer
函数,将累计得到的结果返回。 - 参数:
reducer函数,它接受4个参数:
(1)acc 累计器,是初始值或者上次返回值;
(2)cur,当前值;
(3)idx,当前索引,可选;
(4)src,源数组,可选;
initialValue,可选。如果提供,则作为第一次调用reducer函数的acc值。 - 返回值:reducer函数将每一次执行的结果记录为acc,并将最终的acc返回。
- reducer函数不处理数组中删除的或未被赋值的值。
- 如果数组为空且没有提供初始值,会抛出错误:
- 如果数组仅有一个元素且没有提供初始值,或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行;
不提供初始值的情况下,以下例子对于不同的数组将产生4种不同的输出:
var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback ); // NaN,因为 22.x = undefined
[ { x: 2 }, { x: 22 } ].reduce( maxCallback ); // 22, 正常返回
[ { x: 2 } ].reduce( maxCallback ); // { x: 2 },单值数组,返回唯一值
[ ].reduce( maxCallback ); // TypeError,空数组,报错
- 要累加对象数组中包含的值,必须提供初始值:
var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(
(accumulator, currentValue) => accumulator + currentValue.x
,initialValue
);
console.log(sum) // 6
reduceRight
- 定义:与reduce类似,区别在于从后向前进行累加操作。
let a = ['1', '2', '3', '4', '5'];
let left = a.reduce((prev, cur) => prev + cur); // "12345"
let right = a.reduceRight((prev, cur) => prev + cur); // "54321"