Live2d Test Env

JavaScript高级~数组方法reduce

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

有点抽象,意思可以看做每个元素执行之后,都会有一个汇总结果,你可以通过这个汇总结果返回一个你想要的值,这个值可以是任意类型的。

语法格式:

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

写明白点就是:

arr.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)

其中有接收两个参数:

callback:回调函数

initialValue:初始值

初始值可选

再来看看回调函数的参数,它接收四个参数:

Accumulator (acc) (累计器)

Current Value (cur) (当前值)

Current Index (idx) (当前索引,可选)

Source Array (src) (源数组,可选)

其中累加器和当前值取值有两种情况

回调函数第一次执行时,累加器当前值的取值有两种情况:如果调用reduce()时提供了initialValue累加器取值为initialValue当前值取数组中的第一个值;如果没有提供 initialValue,那么累加器取数组中的第一个值,当前值取数组中的第二个值。

注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

reduce() 如何运行

[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
  return accumulator + currentValue;
});

执行过程:

callback 累加器 当前值 当前索引 当前数组 返回结果
第一次执行 0 1 1 [0, 1, 2, 3, 4] 1
第二次执行 1 2 2 [0, 1, 2, 3, 4] 3
第三次执行 3 3 3 [0, 1, 2, 3, 4] 6
第四次执行 6 4 4 [0, 1, 2, 3, 4] 10

由上表可以看出,每次执行的结果都会作为下一次累加器的值。

注意:不指定初始值的时候,执行过程从索引为1处开始执行

let acc2=arr.reduce(function(accumulator, currentValue, currentIndex, array){
		return accumulator+currentValue
	},10)
callback 累加器 当前值 当前索引 当前数组 返回结果
第一次执行 10 0 0 [0, 1, 2, 3, 4] 10
第二次执行 10 1 1 [0, 1, 2, 3, 4] 11
第三次执行 11 2 2 [0, 1, 2, 3, 4] 13
第四次执行 13 3 3 [0, 1, 2, 3, 4] 16
第五次执行 16 4 4 [0, 1, 2, 3, 4] 20

实例一:数组去重

let arr3 =['q','q','w','e','f','d','s','w','e','w','e','d','s','a','a','a','s']
	let res=arr3.reduce(function(accumulator, currentValue){
		if(accumulator.indexOf(currentValue)===-1){
			accumulator.push(currentValue)
		}
		return accumulator
	},[])

实例二:统计字符出险次数个数

let str ='qqqqwwwwssssddddcccfffvvvvvbbbbb'
	let arr4=str.split("")
	let map2=arr4.reduce(function (accumulator, currentValue) {
		if(accumulator.get(currentValue)===undefined){
			accumulator.set(currentValue,1)
		}else{
			accumulator.set(currentValue,accumulator.get(currentValue)+1)
		}
		return accumulator
	},new Map())

或者:

let str3 ='qqqqwwwwssssddddcccfffvvvvvbbbbb'
	let arr6=str.split("")
	let arr7=arr4.reduce(function (accumulator, currentValue) {
		if(currentValue in accumulator){
			accumulator[currentValue]++
		}else{
			accumulator[currentValue]=1	
		}
		return accumulator
	},{})

 

posted @ 2021-12-06 22:58  waywardcode  阅读(102)  评论(0)    收藏  举报