JS数组之Reduce()用法

一.语法

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

reduce()函数的参数有2个,第一个参数是一个函数(必须),第二个参数是一个初始值(非必须)。

callback:是一个回调函数,执行数组中每个值,注意:如果没有提供initialValue,将不会执行第一个值。包含4个参数:

accumulator 累计器累计回调的返回值,是上一次调用回调时返回的累计值,如果提供了initialValue,那么第一次执行时,为初始值initialValue
currentValue 当前数组中正在处理的元素
index 可选 数组中正在处理的当前元素的索引。如果提供了initialValue,则起始索引为0,如果没有提供,则起始索引为1
array 可选 原数组
initialValue: 初始值,本参数可选,作为第一次调用callback函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素

用法一:

1.数组里所有值求和

var arr = [1, 2, 3, 4, 5]
var result = arr.reduce(function (acc, cur, idx, src) {
  return acc + cur
},0)
console.log(result);//15

改成箭头函数的写法

var result = arr.reduce((acc, cur) => acc + cur, 0)
console.log(result);//15

数组中对象的某一项所有值求和

// 数组中对象的某一项所有值求和
       var arr = [
            { classId: 1, score: 90 },
            { classId: 2, score: 80 },
            { classId: 3, score: 90 }
      ]
      var result = arr.reduce((arr, cur) => {
          return arr + cur.score
      }, 0)
      console.log(result) // 260

3.多维数组扁平化

一般比较复杂的数组或层级比较深的数组,需要进行递归运算,比较简单的数组稍微处理即可

简单数组

var arr = [[1, 2], [3, 4], [5, 6]]
var result = arr.reduce((acc, cur) => {
  return acc.concat(cur)
})
console.log(result);//[1, 2, 3, 4, 5, 6]

层级比较深的数组:

var arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
    
function flat(array) {
  return array.reduce((acc, cur) => {
    return acc.concat(Array.isArray(cur) ? flat(cur) : cur)
  }, [])
}
var result=flat(arr)
console.log(result);//[1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]

思路:这是个嵌套层级比较深的多维数组,需要用到递归,也就是准备一个初始化的空数组,然后对数组中的每一项,进行判断,遇到数组,就重新调用外层的函数,层层递进,直到遇到非数组再合并,后面的执行过程也是一样,非数组,就直接合并,最后得出的结果是一个扁平化的数组

4.统计字符串中出现次数最多的字符

var str = "abccdefefdereerrddcbe"
var array = Array.from(str)
var arrayObj = array.reduce((acc, cur) => {
  if (cur in acc) {
    acc[cur]++
  } else {
    acc[cur] = 1
  }
  return acc
}, {})
console.log(arrayObj);//{a: 1, b: 2, c: 3, d: 4, e: 6, f: 2, r: 3}

var max = 0,name = "";
for (var i in arrayObj) {
  if (arrayObj[i] > max) {
    max = arrayObj[i]
    name = i
  }
}
console.log(name,max)//e 6

求数组的最大值

var arr = [1, 2, 3, 4, 5]
var result = arr.reduce((acc, cur) => {
  return Math.max(acc, cur)
})
console.log(result);//5

6.数组去重

var arr = [1, 2, 3, 4, 5, 'liuqiao1', 'xiaoming1', 2, 4, 'liuqiao1']
var result = arr.reduce((acc, cur) => {
  !acc.includes(cur) && acc.push(cur)
  return acc
}, [])
console.log(result);

三.总结

reduce()函数是数组的高级函数,有很多种用法,后面可以慢慢的拓展,另外,JavaScript还提供了reduceRight()这个函数,功能与reduce()相同,只不过reduceRight是从右往左进行运算,而reduce()是从左往右运算的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值