reduce()方法可以接收两个参数,第一个参数为函数、第二个参数为初始值。 其中第一个函数中可以有四个参数(prev,cur,index,arr),其中prev第一个参数为上次的函数的返回值(第一次为初始值,没有初始值则为空),第二个参数cur为数组中当前被处理的数据,第三个参数index为当前的索引值,第四个参数为该数组。 不改变原数组
1. reduce累加
带初始值的:
let arr = [1,2,3,4];
var sum = arr.reduce((acc,current)=>{
return acc + current
},10)
console.log(sum)//20
不带初始值:
let arr = [1,2,3,4];
var sum = arr.reduce((acc,current)=>{
return acc + current
})
console.log(sum)//10
2. 数组去重
let arr = [1,2,2,3,3,3,3,4,5,6]
let arr1 = arr.reduce((prev,cur)=> {
if(!(prev.includes(cur)) ) {
prev.push(cur)
}
return prev
},[])
console.log(arr1)//[1,2,3,4,5,6]
3.求数组中最大的值
var arr = [1,2,3,4]
let maxNum = arr.reduce((prev,cur)=> {
return Math.max(prev,cur)//Math.max()方法用来判断数值大小
})
console.log(maxNum)//4
4.将二维数组转换为一维数组
var arr = [[1,2],[3,4],[5,6]]
let arr1 = arr.reduce((prev,cur)=> {
return prev.concat(cur)//将数组合并
},[])
console.log(Array.isArray(arr1))//Array.isArray()判断是否是数组的方法
console.log(arr1)//[1,2,3,4,5,6]
5.reduce对象里的属性求和
arr = [
{subject: 'Math', score: '99'},
{subject: 'Chinese', score: '100'},
{subject: 'English', score: '90'}
]
var number = arr.reduce((prev,cur)=> {
return prev + (cur.score - 0)//将score强制转换为number类型
},0)
console.log(number)//289
6.reduce计算数组中每个元素出现的次数
var arr = [1,2,3,3,3,2,2,2,1,1,1,2,3,2,1]
let obj = arr.reduce((prev,cur)=> {
if(cur in prev) {
prev[cur] += 1
}else {
prev[cur] = 1
}
return prev
},{})
console.log(obj)//{"1":5,"2":6,"3":4}
7.reduce按属性给数组分类
var arr = [ {subject: 'Math', score: 90}, {subject: 'Chinese', score: 90}, {subject: 'English', score: 100}, {subject: 'Math', score: 80}, {subject: 'Chinese', score: 95}]
let obj = arr.reduce((prev,cur)=>{
if(!prev[cur.subject]) {//判断对象中是否有该key 没有则创建
prev[cur.subject] = []
}
prev[cur.subject].push(cur)
return prev
},{})
console.log(obj)//{"Math":[{"subject":"Math","score":90},{"subject":"Math","score":80}],"Chinese":[{"subject":"Chinese","score":90},{"subject":"Chinese","score":95}],"English":[{"subject":"English","score":100}]}
8.reduce实现map
var arr = [1,2,3,4]
// 将数组的原型添加reduceMap方法 参数为函数
Array.prototype.reduceMap = function(callback) {
//this指向调用reduceMap方法的数组
return this.reduce((prev,cur,index,array)=> {
const item = callback(cur,index,array)
prev.push(item)
return prev
},[])
}
let arr1 = arr.reduceMap((item,index)=> {
return item + index
})
console.log(arr1)//[1,3,5,7]
9.reduce实现forEach
var arr = [1,2,3,4]
Array.prototype.reduceForEach = function(callback) {
this.reduce((prev,cur,index,array)=> {
callback(cur,index,array)
return prev
},[])
}
arr.reduceForEach((item,index,array)=> {
console.log(item , index)
})
//1 0
//2 1
//3 2
//4 3
10.reduce实现filter
var arr = [1,2,3,4]
Array.prototype.reduceFilter = function(callback) {
return this.reduce((prev,cur,index,array)=> {
if(callback(cur,index,array)) {
prev.push(cur)
}
return prev
},[])
}
let arr1 = arr.reduceFilter((item,index,array)=> {
return item % 2 == 0
})
console.log(arr1)//[2,4]
11.reduce实现find
var arr = [1,2,3,4]
var obj = [{a:1},{a:2},{a:3},{a:4}]
Array.prototype.reduceFind = function(callback) {
return this.reduce((prev,cur,index,array)=> {
if(callback(cur,index,array)) {
if(prev instanceof Array && prev.length == 0) {
prev = cur
}
}
//当数组中没有查找到的结果
if((index == array.length - 1) && prev instanceof Array && prev.length == 0) {
prev = undefined
}
return prev
},[])
}
console.log(
arr.reduceFind((item,index,array)=> {
return item % 2 == 0
})
)//[2]
console.log(obj.reduceFind((item,index,array)=> {
return item.a % 2 == 0
}))//[{a:2}]
console.log(obj.reduceFind((item,index,array)=> {
return item.a % 9 == 0
}))//undefined