JavaScript數(shù)組reduce()方法詳解及使用技巧
今天給大家?guī)淼氖侵皉educe的「JavaScript數(shù)組reduce()方法詳解及奇淫技巧」,覺得的確不錯,意想不到。
一、前言
reduce() 方法接收一個函數(shù)作為累加器,數(shù)組中的每個值(從左到右)開始縮減,最終計算為一個值。
reduce() 可以作為一個高階函數(shù),用于函數(shù)的 compose。
reduce()方法可以搞定的東西,for循環(huán),或者forEach方法有時候也可以搞定,那為啥要用reduce()?這個問題,之前我也想過,要說原因還真找不到,唯一能找到的是:通往成功的道路有很多,但是總有一條路是最捷徑的,亦或許reduce()逼格更高。
二、語法
- arr.reduce(callback,initialValue)
返回最后一個值,reduce 為數(shù)組中的每一個元素依次執(zhí)行回調(diào)函數(shù),不包括數(shù)組中被刪除或從未被賦值的元素,接受四個參數(shù):初始值(或者上一次回調(diào)函數(shù)的返回值),當(dāng)前元素值,當(dāng)前索引,調(diào)用 reduce 的數(shù)組。
三、實例解析intialValue參數(shù)
1、第一個例子:
- var arr = [1, 2, 3, 4];
- var sum = arr.reduce(function(prev, cur, index, arr) {
- console.log(prev, cur, index);
- return prev + cur;
- })
- console.log(arr, sum);
打印結(jié)果:
- 1 2 1
- 3 3 2
- 6 4 3
- [1, 2, 3, 4] 10
2、第二個例子
- var arr = [1, 2, 3, 4];
- var sum = arr.reduce(function(prev, cur, index, arr) {
- console.log(prev, cur, index);
- return prev + cur;
- },0) //注意這里設(shè)置了初始值
- console.log(arr, sum);
打印結(jié)果:
- 0 1 0
- 1 2 1
- 3 3 2
- 6 4 3
- [1, 2, 3, 4] 10
這個例子index是從0開始的,第一次的prev的值是我們設(shè)置的初始值0,數(shù)組長度是4,reduce函數(shù)循環(huán)4次。
結(jié)論:如果沒有提供initialValue,reduce 會從索引1的地方開始執(zhí)行 callback 方法,跳過第一個索引。如果提供initialValue,從索引0開始。
注意:如果這個數(shù)組為空,運(yùn)用reduce是什么情況?
- var arr = [];
- var sum = arr.reduce(function(prev, cur, index, arr) {
- console.log(prev, cur, index);
- return prev + cur;
- })
- //報錯,"TypeError: Reduce of empty array with no initial value" 但是要是我們設(shè)置了初始值就不會報錯,如下:
- var arr = [];
- var sum = arr.reduce(function(prev, cur, index, arr) {
- console.log(prev, cur, index);
- return prev + cur;
- },0)
- console.log(arr, sum); // [] 0
所以一般來說,提供初始值更加安全。
四、reduce簡單用法
當(dāng)然最簡單的就是我們常用的數(shù)組求和,求乘積了。
- var arr = [1, 2, 3, 4];
- var sum = arr.reduce((x,y)=>x+y)
- var mul = arr.reduce((x,y)=>x*y)
- console.log( sum ); //求和,10
- console.log( mul ); //求乘積,24
五、reduce高級用法
(1)計算數(shù)組中每個元素出現(xiàn)的次數(shù)
- let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
- let nameNum = names.reduce((pre,cur)=>{
- if(cur in pre){
- pre[cur]++
- }else{
- pre[cur] = 1
- }
- return pre
- },{})
- console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
(2)數(shù)組去重
- let arr = [1,2,3,4,4,1]
- let newArr = arr.reduce((pre,cur)=>{
- if(!pre.includes(cur)){
- return pre.concat(cur)
- }else{
- return pre
- }
- },[])
- console.log(newArr);// [1, 2, 3, 4]
(3)將二維數(shù)組轉(zhuǎn)化為一維
- 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]
(4)將多維數(shù)組轉(zhuǎn)化為一維
- let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
- const newArr = function(arr){
- return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
- }
- console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
(5)對象里的屬性求和
- var result = [
- {
- subject: 'math',
- score: 10
- },
- {
- subject: 'chinese',
- score: 20
- },
- {
- subject: 'english',
- score: 30
- }
- ];
- var sum = result.reduce(function(prev, cur) {
- return cur.score + prev;
- }, 0);
- console.log(sum) //60
(6)將[1,3,1,4]轉(zhuǎn)為數(shù)字1314
- function addDigitValue(prev,curr,curIndex,array){
- var exponent = (array.length -1) -curIndex;
- var digitValue = curr*Math.pow(10,exponent);
- return prev + digitValue;
- }
- var arr6 = [1,3,1,4];
- var result7 = arr6.reduce(addDigitValue,0);
- console.info('result7',result7);
本文轉(zhuǎn)載自微信公眾號「松寶寫代碼」