数组-reduce()方法

reduce()是接受一个函数作为累加器,数组中每一个值从左到右计算成一个值

语法:

arr.reduce(callback,[initialValuce])

callback//回调有四个参数

1.previousValue //上一次调用返回的值或者是提供的初始值(initialValue)
2.currentValue //数组当前被处理的元素
3.index//当前元素的索引值
4.array//调用的数组

initialValue //作为第一次调用callback的初始参数

initialValue解析

例子1.

var arr= [1,2,3,4];
var sum=arr.reduce((prev,cur,index,arr)=>{
      console.log(prev,cur,index)
       return prev+cur
})
    console.log(arr,sum)

打印结果

1  2  1
3  3  2
6  4  3
[1, 2, 3, 4] 10

总结:index是从1开始,数组长度是4,循环3次,第一次prev的值是数组的第一个值

例子2.

var arr= [1,2,3,4];
var sum=arr.reduce((prev,cur,index,arr)=>{
      console.log(prev,cur,index,arr)
      return prev+cur
},0)
    console.log(arr,sum)

打印结果

0 1 0
1 2 1 
3 3 2
6 4 3
[1, 2, 3, 4] 10

 总结:initialValue传值的话,索引是从0开始,循环4次

如果数组是空的话,initialValue没有传值的话会报错,但是如果传值的话就不会报错,所以一搬传值比较保险

var arr = []
var sum=arr1.reduce((prev,cur,index,arr)=>{
      console.log("1.",prev,cur,index,arr) 
      return prev+cur
})
   //报错  Reduce of empty array with no initial value
var sum=arr1.reduce((prev,cur,index,arr)=>{
      console.log(prev,cur,index,arr) 
      return prev+cur
},0)
      console.log(arr1,sum) //[] 0  不会报错

用reduce计算求和、求积

var arr = [1,2,3,4,5]
var sum=arr.reduce((x,y)=>x+y)
var mul=arr.reduce((x,y)=>x*y)
console.log(sum) //15
console.log(mul) //120
var mul1=arr.reduce((x,y)=>{
    return x*y
},1)
console.log(mul1) //120

计算数组中每个元素出现的次数

let arr =['张三','张三','李四','李四','王二']
let arrnum=arr.reduce((prev,cur)=>{
    console.log(prev,cur)
    if(cur in prev){
        prev[cur]++
    }else{
       prev[cur]=1 
    }
    return prev
},{})
console.log(arrnum)

结果

{} "张三"
{张三: 1} "张三"
{张三: 2} "李四"
{张三: 2, 李四: 1} "李四"
{张三: 2, 李四: 2} "王二"
{张三: 2, 李四: 2, 王二: 1}

if in

let obj = {
    name:'张三'
}
if('name' in obj){
    console.log('obj对象中包含name属性')
}else{
    console.log('obj对象中没有name属性')
}
//结果  obj对象中包含name属性

if in 判断对象是否包含某个属性

去重

let arr = [1,2,3,4,4,1,3]
let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){ //判断pre是否包含cur
      return pre.concat(cur) //不包含就添加一个
    }else{
      return pre //包含就直接返回上一次执行的结果
    }
},[])
console.log(newArr);// [1, 2, 3, 4]
 
 
let arr = [1,2,3,4,4,1,3,5,5]
let newarr = arr.reduce((pre,cur)=>{
    pre.indexOf(cur) === -1 && pre.push(cur)
    return pre
},[])
console.log(newarr)// [1, 2, 3, 4, 5]
 
let arr = [1,2,3,4,4,1,3,5,5]
let newarr = arr.reduce((pre,cur)=>pre.includes(cur)?pre:[...pre,cur],[])
console.log(newarr) //[1, 2, 3, 4, 5]

二维转成一维

let arr = [[6,7],[4,5],[1,2,3]]
let newarr = arr.reduce((pre,cur)=>pre.concat(cur),[])
console.log(newarr) //[6, 7, 4, 5, 1, 2, 3]

多维转成一维

let arr = [[1,2,3],[4,5,6],[[7,8,9],10],[[11],[12],[13]]]
const newarr = function(arr){
    return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newarr(cur):cur),[])
}
console.log(newarr(arr)) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

对象里的属性求和

let arr = [
    {
        name:'张三',
        num:80
    },
    {
        name:'张三',
        num:140
    },
    {
        name:'张三',
        num:50
    },
    {
        name:'张三',
        num:60
    },
]
let newarr = arr.reduce((pre,cur)=>pre+cur.num,0)
console.log(newarr) //330

reduceRight()方法就是从右到左

posted @ 2021-01-05 15:37  煎饼不要香菜呀  阅读(333)  评论(0编辑  收藏  举报