reduce() 为数组中的每一个元素依次 执行回调函数,不包括数组中被删除的元素或者未赋值的元素,接受四个参数:初始值(或者上次回调函数的返回值),当前元素值,当前索引,调用reduce的数组.
语法
arr.reduce(function(prev,cur,index,arr){
...
}, init);
arr 表示原数组;
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
init 表示初始值。
看上去是不是感觉很复杂?没关系,只是看起来而已,其实常用的参数只有两个:prev 和 cur。接下来我们跟着实例来看看具体用法吧~
数组元素累加
let a=[1,2,33,4];let sum =a.reduce(function(pre,cur){return pre+cur},0)console.log(sum);//40
由于传入了初始值0,所以开始时prev的值为0,cur的值为数组第一项3,相加之后返回值为3作为下一轮回调的prev值,然后再继续与下一个数组项相加,以此类推,直至完成所有数组项的和并返回。
得到一串字符串中每个字母出现的次数
var arrString = 'sdfddgtf';let res = arrString.split('').reduce(function (res, cur) {res[cur] ? res[cur]++ : res[cur] = 1;return res;}, {})console.log(res);//{s: 1, d: 3, f: 2, g: 1, t: 1}
2. 求数组项最大值或者最小值
let a = [1, 2, 33, 4];let max = a.reduce(function (pre, cur) {return Math.max(pre, cur)}, 0)let min = a.reduce(function (pre, cur) {return Math.min(pre, cur)})console.log(max);//33console.log(min);//1
3. 数组去重
let a = [1, 2, 33, 4,2,4];let arr=a.reduce(function(pre,cur){console.log(pre,cur,pre.indexOf(cur) ==-1)pre.indexOf(cur) ==-1 && pre.push(cur);// 只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;return pre;},[])console.log(arr);//[1, 2, 33, 4]
① 初始化一个空数组
② 将需要去重处理的数组中的第1项在初始化数组中查找,如果找不到(空数组中肯定找不到),就将该项添加到初始化数组中
③ 将需要去重处理的数组中的第2项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组中
④ ……
⑤ 将需要去重处理的数组中的第n项在初始化数组中查找,如果找不到,就将该项继续添加到初始化数组中
⑥ 将这个初始化数组返回