参数
arr.reduce(callback(prev,cur,index,arr),init);
- prev:上一次调用时的返回值,或者初始值init(传入init)
- cur:当前正在处理的数组元素
- index:和当前正在处理的数组元素一一对应
- arr:原数组
- init:初始值,该值也决定了返回值的数据类型
常用的参数:prev、cur、init
应用场景
- 数组求和、求乘积
- 计算数组中每个元素的出现次数
- 数组扁平化
- 数组去重
- 对象里面的属性求和
数组求和
const array=[1,2,3,4,5];
function getSum(arr){
return arr.reduce((prev,cur)=>prev+cur);
}
console.log(getSum(array));//15
求乘积也是一样的方法
reduce实现数组扁平化
- 传入一个空数组作为prev的初始值,cur从数组的第一个元素开始遍历
- 如果数组元素是基本数据类型,直接通过concat()连接到pre数组里面去,如果是数组,则递归调用函数
const array=[1,2,[3,[4,[5,[6,7,[8]]]]]];
function toFlat(arr){
return arr.reduce((prev,cur)=>{
return prev.concat(Array.isArray(cur)?toFlat(cur):cur);
},[]);
}
console.log(toFlat(array));//[1, 2, 3, 4, 5, 6, 7, 8]
统计数组中元素出现的次数
- 利用对象的中括号形式获取/设置属性值的特点,初始化一个空对象,将数组元素作为对象的属性名,出现次数作为对象的属性值
- 如果数组元素已经出现过,将其属性值加1
- 如果没有出现过,将其作为对象属性,属性值为1
const array=['amethyst','amethyst','lanlan','puppy','puppy'];
function getCount(arr){
return arr.reduce((prev,cur)=>{
if(cur in prev){
prev[cur]++;
}else{
prev[cur]=1;
}
return prev;
},{
});
}
console.log(getCount(array));
reduce数组去重
- 遍历数组,如果数组中不存在当前元素,就将其push进pre中去,借助数组的includes方法来判断数组中是否含有该元素
const array=['amethyst','amethyst','lanlan','puppy','puppy'];
function newArr(arr){
return arr.reduce((prev,cur)=>{
if(!prev.includes(cur)){
prev.push(cur);
}
return prev;
},[]);
}
console.log(newArr(array));// ["amethyst", "lanlan", "puppy"]