reduce相当于一个累计器,将累计器逐个作用在数组元素上,把上一次输出的值作为下一次输入的值。它接收两个参数,第一个参数callback
为回调函数(必选),第二个参数initialValue
为初始值(可选)。
回调函数接收4个参数:total 回调函数返回的累积值(必选),value 当前处理的数组元素(必选),index 当前数组元素的索引值(可选),array 调用reduce()
的数组(可选)。回调函数第一次执行时,如果调用reduce()
时提供了initialValue
,total
取值为initialValue
,value
取数组中的第一个值;如果没有提供 initialValue
,那么total
取数组中的第一个值,value
取数组中的第二个值。
reduce的一些用法,注:reduce不会改变原数组
1.数组去重
let a=[1,1,2,2,3,3]
let b=a.reduce((t,v)=>t.includes(v)?t:[...t,v],[])
console.log(a)//[1,1,2,2,3,3]
console.log(b)//[]1,2,3]
2.数组降维
let a = [
[1, 1],
[2, 2],
[3, 3]
]
//let b = a.reduce((t, v) => [...t, ...v], [])
let b = a.reduce((t, v) => t.concat(v), [])
console.log(b) //[ 1, 1, 2, 2, 3, 3 ]
3.求数组最大最小值
let a = [1, 2, 3, 4, 5]
let b = a.reduce((t, v) => t > v ? t : v)
let c = a.reduce((t, v) => t < v ? t : v)
onsole.log(b);//5
console.log(c);//1
4.计算数组元素出现的次数
let a = [1, 1, 2, 2, 3, 3]
let b = a.reduce((t, v) => (t[v] = (t[v] || 0) + 1, t), {})
console.log(b); //{ 1: 2, 2: 2, 3: 2 }
5.实现filter
Array.prototype.myFilter = function(handler) {
if (typeof handler !== 'function') {
console.log(new Error('handler is not a function'));
}
return this.reduce((t, v) => handler(v) ? [...t, v] : t, [])
}
var arr = [1, 2, 3, 4, 5]
var arr1 = arr.myFilter(item => item > 3)
console.log(arr1); //[4,5]
6.实现map
Array.prototype.myMap = function(handler) {
if (typeof handler !== 'function') {
console.log(new Error('handler is not a function'));
}
return this.reduce((t, v) => [...t, handler(v)], [])
}
var arr2 = [1, 2, 3, 4, 5]
var arr12 = arr.myMap(item => item * 3)
console.log(arr12); //[3,6,9,12,15]