關於Array.reduce的理解與擴充

坤凡1996發表於2019-02-16

2018年1月6日

首先我要感謝我的同事徒步上山看日出在我第一份實習的時候對我的指導,現在我也開始跟他一樣開始養成寫部落格的習慣

現在開始討論我遇到的第一個問題,這是我在看javascript高階程式設計看的一個令像我這樣的新手值得思考的問題


文章思路

  • 什麼是array的reduce,用法?
  • 什麼是迭代==>(在學校學的被狗吃了系列~)

關於Array.ruduce( )

書中是這麼寫的

ECMAScript 5 還新增了兩個歸併陣列的方法: reduce()和 reduceRight()。這兩個方法都會迭代陣列的所有項,然後構建一個最終返回的值。其中, reduce()方法從陣列的第一項開始,逐個遍歷到最後。而 reduceRight()則從陣列的最後一項開始,向前遍歷到第一項。

這兩個方法都接收兩個引數:一個在每一項上呼叫的函式和(可選的)作為歸併基礎的初始值。傳給 reduce()和 reduceRight()的函式接收 4 個引數:前一個值、當前值、項的索引和陣列物件。
這個函式返回的任何值都會作為第一個引數自動傳給下一項。第一次迭代發生在陣列的第二項上,因此第一個引數是陣列的第一項,第二個引數就是陣列的第二項。
使用 reduce()方法可以執行求陣列中所有值之和的操作,比如:

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
return prev + cur;
});
alert(sum);

第一次執行回撥函式, prev 是 1, cur 是 2。第二次, prev 是 3(1 加 2 的結果), cur 是 3(陣列的第三項)。這個過程會持續到把陣列中的每一項都訪問一遍,最後返回結果。


我的理解
陣列values有5項,所以陣列要執行4次運算

  • (1+2) => 3
  • (3+3) => 6
  • (6+4) => 10
  • (10+5) => 15

那如何證明呢,下面我自己寫的demo

let arr=[1,2,3,4,5]
let sum = arr.reduce((prev,cur,index,array)=>{
        console.log("執行了第",index,"次cur的值是",cur,"prev的值是",prev)
        //原來console.log這樣可以用
        return prev+cur
})
console.log(sum)

結果是

執行了第 1 次cur的值是 2 prev的值是 1<br/>
執行了第 2 次cur的值是 3 prev的值是 3<br/>
執行了第 3 次cur的值是 4 prev的值是 6<br/>
執行了第 4 次cur的值是 5 prev的值是 10<br/>
15

===>猜想get!!!
===>不過如果用迭代可以怎麼做

什麼是迭代(才發現資料結構這種東西真的很重要啊,哪裡都能用到,js也是!!!)

關於迭代(我去百度一波….)

定義:一個函式直接或間接呼叫自己

迭代需要滿足的三個條件:

  • 必須有一個明確的中止條件
  • 該函式所處理的資料規模必須在遞減
  • 這個轉化必須是可解的
int sum(int n )
{
    if(n==1) return 1;
    else return n+sum(n-1);
}

同樣是求0~n的和,這段程式碼是每次在函式體中呼叫自身函式,1~n的和可以拆分成兩個部分,1~n-1的和加上n,因此,遞迴的思想就是:在函式或子過程的內部,直接或者間接地呼叫自己的演算法,從而把問題轉化為規模縮小了的同類問題的子問題<br/>
遞迴演算法的步驟:

  • 確定遞迴公式,如sum(n) = sum(n-1)+n
  • 確定遞迴結束條件,如n=1結束遞迴

剛才的函式

let arr=[1,2,3,4,5]
let sum = arr.reduce((prev,cur,index,array)=>{
        console.log("執行了第",index,"次cur的值是",cur,"prev的值是",prev)
        //原來console.log這樣可以用
        return prev+cur
})
console.log(sum)

就可以理解為

function add(n){
    if(n==1){
        return 1
    }
    return add(n-1)+n
}
console.log(add(5));

當第一次執行的時候函式add(n)碰到add(n-1)的時候就會進入這個函式執行add(n-1),[在這裡,我們注意到add(1)=1(就是說遞迴終止)]之後又遇到add(n-1-1),當n=2時 =>

add(2){
  add(2-1)+2 => add(1)+2 => 1+2
}

由此可推

add(3){
  add(2)+3 =>1+2+3
}
add(4){
  add(3)+4 =>1+2+3+4
}
add(5){
  add(4)+5 => 1+2+3+4+5
}

so,這次部落格寫完了,謝謝大家閱讀,求點贊求人氣哈哈~~

相關文章