reduce方法詳解總結(jié)

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ǔ)很重要!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容