第一次見到reduce 是在js 的高階程式設計中,它的意思是把乙個陣列減少為乙個數,舉的例子是陣列中元素的求和。它接受乙個函式作為引數,函式又有兩個引數,乙個是prev, 前乙個值,乙個是next, 後乙個值,然後函式體就是返回相加的值。
let array = [1, 3, 5];let sum = array.reduce((prev, next) =>)
console.log(sum);
我對reduce 的理解也僅限於此,只停留在了表面,當然,除了這個例子之後,我也不會用reduce. 今天在讀js函式式程式設計相關書籍的時候,又遇到reduce, 仔細讀了幾遍,加深了理解,大體上懂了它的原理和用法。
reduce 確實是把陣列減少為乙個值,也是接受乙個函式作為引數,但它還有乙個可選的第二個引數。對函式接受的兩個引數的理解也有偏差,第乙個引數準確來講應該是個累計值,第二個引數應該是陣列的每乙個項的值。還是陣列的求和為例,我們完全可以不用recude, 直接迴圈遍歷陣列就可以。那麼我們該怎麼做呢?
先宣告乙個變數,來儲存求和後的值。
let sum = 0;
然後迴圈遍歷陣列的每一項,和sum 進行相加
for (let index = 0; index < array.length; index++)
完全沒有問題,可以求出陣列中的元素的和。陣列元素的求和應該都是這樣的步驟,我們嘗試把這個步驟封裝一下, 先直接定義乙個函式把所有步驟包含起來, 只把console.log(sum) 變成return sum;
functionreduce ()
return
sum;
}
現在來看封裝的函式,可以發現有幾個問題:
1,let sum = 0 不太合適,在函式中固定乙個變數的值,不具有靈活性。這個很簡單,可以宣告乙個變數,讓sum 等於傳遞進行的值。如果沒有,可以默為0 , 變數為initvalue;
2,這個問題也很簡單地,就是要遍歷的陣列,要把陣列傳遞進來,所以要接受乙個陣列引數,用來進行遍歷。
3,這個問題可能不太好理解,但也是最關鍵的。第三個問題是在sum = sum + element;sum + element是這個函式要做的事情,如果不指定,這個reduce 函式只能做求和運算。我們想讓這個函式更為通用,函式要做的事情就要讓使用者進行指定。要做的事情,在js 中,可以用函式進行表示,所以接受乙個函式做為引數,這個函式要接受兩個引數sum, elemnet, 然後在函式體中指定這個函式要做什麼事情。由於sum + element 的值要賦值為sum, 所以這個函式還要有返回值。
functionreduce (array, fn, initvalue)
return
sum;
}
呼叫我們自己封裝的reduce 時行陣列的求和
let result = reduce(array, (sum, element) => sum + element);
現在我們來對比原生的呼叫方式和自己封裝的方式?可以發現沒有本質不同。唯一的不同可能是我們的第乙個引數是陣列,而原生沒有,這是因為原生的方法是定義在陣列原型上,所 以沒有接受陣列作為引數,對於理解reduce 函式來說,這沒有什麼本質的不同。通過封裝的過程,我們更能明白接受的函式的引數的意思。這個函式至少要接受兩個引數,第乙個引數的真正意義應該是呼叫函式所返回的值,由於在第乙個呼叫函式之前,沒有返回值,所以我們可以給它賦初值,或通過第三個引數,或直接調為0。 第二個引數,就是陣列的每一項,只有不停的遍歷陣列中的每一項,最終才能把陣列變成乙個值。其實初值還有乙個更好的辦法,如果沒有傳遞進來,可以取陣列的第一項作為初始值。最終的函式可能如下:
const reduce = (array, fn, initialvalue) =>else
return
sum;
}
通過以上分析,我們可以看到,reduce函式真正的核心在於傳遞進去的函式。正確的使用reduce 就是要正確的寫好這個函式,通常這個函式要滿足一下,幾點要求。
1, 這個函式至少要接受兩個引數進行計算,乙個引數是累計值,乙個引數是陣列的每乙個元素
2, 這個函式必須要有返回值,因為要用它進行下一步的運算,並且,必須返回乙個由引數進行計算的得到結果值,最後返回的值,還是要和陣列中的元素型別相同,這還是因為它要進行下一步的運算。
3, 初始的結果值,可以由第三個引數進行傳遞,也可以不傳,如果不傳的話,初始的累計值預設為第乙個引數。
oracle中的開窗函式理解
開窗函式指定了分析函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變化而變化,舉例如下 over order by salary 按照salary排序進行累計,order by是個預設的開窗函式 over partition by deptno 按照部門分割槽 over order by sa...
Python中函式引數理解
python中函式定義主要包含4類引數 1 必選引數 2 預設引數 3 可變引數 4 關鍵字引數 def power x x 必選引數 return x 2def power x,n 2 n 預設引數 return x n即傳入的引數個數是可變的。def calc numbers numbers 可...
numpy中mean 函式理解
numpy.mean a,axis none,dtype none,out none 沿指定軸計算算術平均值。作用 返回陣列元素的平均值。預設情況下,平均值取自展平的陣列,否則取自指定的軸。引數 a array like 包含期望平均值的數字的陣列。如果a不是陣列,則嘗試進行轉換。axis 整數,可...