1.reduce方法介紹:
reduce語法:arr.reduce(callback,[initialValue])
callback函數(shù)可接受四個(gè)參數(shù):
callback (執(zhí)行數(shù)組中每個(gè)值的函數(shù),包含四個(gè)參數(shù))
1、previousValue (上一次調(diào)用回調(diào)返回的值,或者是提供的初始值(initialValue))
2、currentValue (數(shù)組中當(dāng)前被處理的元素)
3、index (當(dāng)前元素在數(shù)組中的索引)
4、array (調(diào)用 reduce 的數(shù)組)
initialValue (作為第一次調(diào)用 callback 的第一個(gè)參數(shù)。)
記得callback內(nèi)部的結(jié)果一定要return 出去,結(jié)果才能被接收
例子:
1、數(shù)組求和(一)
let arr = [1, 2, 3, 4];
let sum = arr.reduce((pre,cur,index,arr)=>{
return pre + cur;
});
打印一下每次的pre、cur、index來看下計(jì)算的過程
| pre | cur | pre+cur | index |
|---|---|---|---|
| 1 | 2 | 1+2 = 3 | 1 |
| 3 | 3 | 3+3 = 6 | 2 |
| 6 | 4 | 6+4 = 10 | 3 |
- 可看出每次的pre是上次調(diào)用函數(shù)的返回值,即上次計(jì)算的和,作為下次調(diào)用的第一個(gè)參數(shù)值。
- reduce方法沒有設(shè)置可選參數(shù)
initialValue,所以index從1開始。第一次的pre的值也是數(shù)組的第一個(gè)值。 - 可看出求和本應(yīng)遍歷4次,但是卻遍歷了三次,由此可能是遍歷復(fù)雜度稍微減少一點(diǎn)。
2、數(shù)組求和(二)
let arr = [1, 2, 3, 4];
let sum = arr.reduce((pre,cur,index,arr)=>{
return pre + cur;
},0);
設(shè)置了initialValue,第一次回調(diào)的初始值,相當(dāng)于給pre賦初值,再來看打印的狀況
| pre | cur | pre+cur | index |
|---|---|---|---|
| 0 | 1 | 0+1 = 1 | 0 |
| 1 | 2 | 1+2 = 3 | 1 |
| 3 | 3 | 3+3 = 6 | 2 |
| 6 | 4 | 6+4 = 10 | 3 |
- 同樣的,上次的函數(shù)結(jié)果是下次計(jì)算的pre值,但是不同的是,因?yàn)樵O(shè)置了第一次回調(diào)函數(shù)的值為0,所以index也從0開始,總共遍歷4次。
由此可見,initialValue的設(shè)置,會(huì)改變執(zhí)行的index開始值,以及每次的pre值,但是執(zhí)行的結(jié)果不變。
3.數(shù)組去重
let arr = [1,3,4,2,6,3,7];
let resArr = arr.reduce((pre,cur)=>{
console.log(pre);
if(!pre.includes(cur)){
return pre.concat(cur); concat方法,會(huì)返回一個(gè)新的副本數(shù)組
}
else{
return pre;
}
},[])
console.log(resArr);//[1,3,4,2,6,7]
4.統(tǒng)計(jì)數(shù)組元素出現(xiàn)次數(shù)
let objArr = ['one','two','three','four','one','four'];
let resObj = objArr.reduce((pre,cur)=>{
if(cur in pre){ //已存在
pre[cur]++;
}
else{ //不存在
pre[cur] = 1;
}
console.log(pre);
return pre;
},{})
console.log(resObj); //{one: 2, two: 1, three: 1, four: 2}
- 打印pre 看其執(zhí)行過程:
{one: 1}
{one: 1, two: 1}
{one: 1, two: 1, three: 1}
{one: 1, two: 1, three: 1, four: 1}
{one: 2, two: 1, three: 1, four: 1}
{one: 2, two: 1, three: 1, four: 2}
5.二維數(shù)組轉(zhuǎn)換成一維
let arr = [1,[2,3],4,5,[7,8]];
let resArr = arr.reduce((pre,cur) =>{
console.log(pre);
return pre.concat(cur);
},[])
console.log(resArr); //[1, 2, 3, 4, 5, 7, 8]
- 打印pre看其執(zhí)行過程:(其實(shí)很簡單)
[]
[1]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 7, 8]
總結(jié):上面這些例子,都是規(guī)定了pre的初始值,利用了pre 是前一次回調(diào)函數(shù)的返回值的特性,去進(jìn)行操作。
上面這些,就算比較常接觸的數(shù)組一些操作,用reduce也是非常的方便了。
看到有篇博客,講的很不錯(cuò),就學(xué)習(xí)總結(jié)一下http://www.itdecent.cn/p/e375ba1cfc47
雖然是假期,但是還是要學(xué)習(xí),基礎(chǔ)很重要!