JS中filter()和reduce()方法介绍

JS中filter()和reduce()方法介绍

filter()

filter()方法是ES6的新语法,和forEach,map类似。filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意:filter() 不会对空数组进行检测。filter不会改变原始数组。

语法:

array.filter(function(currentValue,index,arr),thisValue)
  • 参数:
    • 回调函数function(currentValue,index,arr) 必需,数组中每个元素需要调用的函数。
    • 函数参数:currentValue(必需):当前元素,index(可选):当前元素的索引值, arr(可选):当前元素属于的数组对象(可以理解为当前遍历的数组对象)。
    • thisValue(可选):对象作为该执行回调时使用,传递给函数,用作"this"的值。如果省略了thisValue,或者传入null、undefined,那么回调函数的this为全局对象。

简单例子:

 //返回数组中所有大于18的元素
let arr = [20,30,45,15,16]; 
let newArr = arr.filter((item)=>{
    return item > 18; 
})
console.log(newArr);//[20,30,45]
  • filter也不支持break和continue。map和filter返回值对比:map()中的return时将被刺迭代遍历时处理后的元素添加到map返回值中,filter中的return是用来判断本次迭代是否将元素放到返回之中,返回值是一个新数组,新数组中的每个元素为每次filter迭代时return为true的值。

reduce()

reduce()方法是ES6的新语法。reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。reduce()可以作为一个高阶函数,用于函数的compose。
注意:reduce()对于空数组是不会执行回调函数的。

语法:

array.reduce(function(total,currentValue,currentIndex,arr),initialValue)
  • 参数:
    • 回调函数function(total,currentValue,currentIndex,arr) 必需,用于执行每个数组元素的函数。
    • 函数参数:total(必需):初始值,或者计算结束后的返回值,currentValue(必需):当前元素,currentIndex(可选):当前元素的索引值, arr(可选):当前元素属于的数组对象(可以理解为当前遍历的数组对象)。
    • initialValue(可选):传递给函数的初始值。

函数运行原理的简单说明:

如果你依然没有懂,那么再接着详细的介绍:

reduce(function(total,currentValue,currentIndex,arr),initialValue)
  1. 启动时,如果reduce定义了起始值(initialValue),则会将起始值赋给total,如果没有设定起始值,则将数组第一个值赋给total。运行时,第二次及后续执行时,会将前一次执行的结果赋给total。
  2. 启动时,如果total为起始值,currentValue则为数组第一个值,如果total为数组第一个值,currentValue则为第二个。运行时,每次调用,都会按顺序将currentValue当前位置的下一个值赋给currentValue。
    JS中filter()和reduce()方法介绍

简单例子:

//计算数组元素相加后的总和
let arr = [1,2,3,4,5];
let sum = arr.reduce((total,item)=>{
    return total + item;
},0);
console.log(sum);//15

较复杂的例子:

reduce()是一个很强大的方法,我们一般利用它来处理更加复杂的业务逻辑。

  • 我们利用reduce()方法获取所有商品的总价格:

    let goodList =[
         {
             good:'books',
             price:50
         },
         {
             good:'phone',
             price:4999
         },
         {
             good:'food',
             price:25
         }
     ];
     let count = goodList.reduce((prev,cur)=>{
         return prev + cur.price; 
     },0);
     console.log(count) //5074
    
  • 如果用户手里有20元优惠券的话,我们可以让初始值为-20,也就是:

     let goodList =[
            {
                good:'books',
                price:50
            },
            {
                good:'phone',
                price:4999
            },
            {
                good:'food',
                price:25
            }
        ]
     let count = goodList.reduce((prev,cur)=>{
         return prev + cur.price; 
     },-20);
     console.log(count) //5054
    
  • 假设每个商品都在打折,并且打折力度都不同,同时用户有10元优惠券,我们也可以通过reduce方便的计算总价格:

    let goodList =[
            {
                good:'books',
                price:50
            },
            {
                good:'phone',
                price:4999
            },
            {
                good:'food',
                price:25
            }
        ]
    let disCount = {
        books:0.8,
        phone:0.95,
        food:0.9
    }
    let count = goodList.reduce((prev,cur)=>{
        return cur.price * disCount[cur.good] + prev;
    },-10);
    console.log(count);//4801.55
    
  • 求一串字符串中每个字符的出现次数:
    这里请前往 面试之求一串字符串中每个字符的出现次数 查看

上一篇:java web之Filter


下一篇:【无标题】