reduce函数的语法格式
arr.reduce(callback,[initialValue])
/* callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数(初始previousValue)。)*/
下面上代码就更好理解了
//数组求和
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
//调试,实在不明白可以单步调试一下
// debugger
console.log(prev, cur, index,arr);
return prev + cur;
//下面的指定pre的初始值为0
},0)
console.log(arr, sum);
这个函数本质就是遍历数组,cur和index会从数组的开始移动到最后,函数的返回值作为下一次调用函数的pre值(如果遍历完就是reduce的返回值)
第一次调用函数:pre = 0,cur = 1,index = 0,arr=[1,2,3,4] 返回(下一次的pre)1;
第二次调用函数:pre = 1,cur = 2,index = 1,arr=[1,2,3,4] 返回(下一次的pre)3;
第三次调用函数:pre = 3,cur = 3,index = 2,arr=[1,2,3,4] 返回(下一次的pre)6;
第四次调用函数:pre = 6,cur = 4,index = 3,arr=[1,2,3,4]返回reduce函数的返回值10;
在看下面demon(reduce高级用法)加深理解
//reduce函数的高级用法,求数组中元素的出现次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let nameNum = names.reduce((pre,cur,index)=>{
console.log(pre,cur,index)
if(cur in pre){
pre[cur]++
}else{
pre[cur] = 1
}
console.log(pre,cur,index)
return pre
},
//这里设置pre初始值是空对象
{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
//数组的去重
let arr = [1,2,3,4,5,1,3,7,2,1,3,4,8,5,5,7]
newarr = arr.reduce((pre,curr,index,arr)=>{
// debugger
console.log(pre,curr)
//console.log(typeof pre,typeof curr)
//不可以写成curr in pre 原因往下看
if (pre.includes(curr)) console.log(curr+"已经包含在对象中了");
else pre.push(curr)
return pre
},[])
console.log(arr)
console.log(newarr)*/
上面的两个例子,第一个判断一个属性是否在对象中可以用in关键字来做。
但是坑来了,为什么下面判断元素是否在数组中不可以用in?这就涉及到in和includes的区别了,请看下面的博客
ES6 in和includes区别
文章如有错误欢迎大佬批评指正。