reduce方法详解(含数组扁平化、数组去重)

参数

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"]

Guess you like

Origin blog.csdn.net/Amethystlry/article/details/116892720