reduce()方法
1. 简介
reduce
方法是数组的归并方法,这个方法与迭代方法(forEach
方法等)一样都会对数组进行遍历,不同的是reduce
方法的回调函数中的第一个参数得到的是迭代结算后的结果。
2. 语法
reduce方法接收两个参数,如下:
arr.reduce(callback(acl,val,idx,array),initVal)
-
第一个参数是要执行的函数,该函数中传入的参数
- acl:上一次调用回调时返回的累积值
- val:当前元素,必选项
- idx:当前索引,可选项
- array:被遍历的数组,可选项
-
第二个参数是函数迭代的数值
- initVal:第一次调用函数时的第一个参数的值,如果没有提供初始值,则将使用数组中的第一个元素
注意:
- 有
initVal
值时,acl
为initVal
;反之则为数组的第一个值 - 返回值作为下一次迭代的
acl
值
3. 应用
-
数组中的元素求和
let arr = [1,2,3,4]; let sum = arr.reduce(function(acl,val){ console.log(acl,val) return acl+val; }) console.log(sum)
//结果
第一次迭代 acl=1; val=2 函数返回值为:3
第二次迭代 acl=3; val=3 函数返回值为:6
第一次迭代 acl=6; val=4 函数返回值为:10
sum=10 -
计算数组中的每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; let nameNum = names.reduce((prev,cur) =>{ if(cur in prev){ prev[cur]++ }else{ prev[cur] = 1 } return prev },{}) console.log(nameNum);//{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
-
数组去重
// 数组去重 let arr = [12, 34, 34, 342, 345, 34, 123, 345, 45, 12] let newArr = arr.reduce((prev, cur) => { // 判断数组中是否存在当前元素,如果不存在的话,再将其添加到数组中 prev.indexOf(next) == -1 && prev.push(cur) return prev }, []) // 设置迭代初始值为一个空数组 // 原数组不会发生改变 console.log(arr) // [12, 34, 34, 342, 345, 34, 123, 345, 45, 12] // 去除重复项的新数组 console.log(newArr) // [12, 34, 342, 345, 123, 45]
-
将二维数组转化为一维
let arr = [[0,1],[2,3],[4,5]] let newArr = arr.reduce((pre.cur)=>{ return pre.concat(cur) },[]) console.log(newArr);//[0,1,2,3,4,5]