2017-10-18 41 views
-3
var arr = [1,2,3]; 
var max = arr.reduce(function(a, b) { 
return Math.max(a, b); 
}); 

我正在通過MDN文檔REDUCE函數,在上面的代碼片段中,我只是想知道函數(a,b)做了什麼。它是如何工作將它經歷這樣JavaScript中的Array.prototype.reduce函數

function (1,2) 
{ 

} 

function(2,3) 
{ 

} 

function(3,1) 
{ 

} 

而且我發現多了一個例子總結了陣列

var numbers = [0, 1, 2, 3]; 
var result = numbers.reduce(function(accumulator, currentValue) { 
    return accumulator + currentValue; 
},0); 


console.log(result); 

所以在上面的例子中的所有元素,

  1. 如何函數立即知道它的第一個參數是一個累加器?
  2. 第一次迭代什麼是累加器和當前值(我假設函數(0,1))
  3. 如果我沒有給出初始值(這裏是0),會發生什麼情況。這個初始值是否會在第一次迭代中存儲到累加器中?

有人可以幫助我理解這個功能嗎?

+3

你試過閱讀'reduce'方法的文檔?它回答你的問題。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?v=a – Barmar

+0

「我正在通過MDN文檔REDUCE函數」,所以我認爲這是確切的參考。似乎這個問題更多的是「reduce」的實現是什麼?也許? – msanford

+0

'[1,2,3] .reduce((a,b)=> {console.log(「a&b =」,a,b); return Math.max(a,b);})'IOW :(1,2)(2,3)= 3 – Keith

回答

2

如何做一個函數立刻知道它的第一個參數是累加器

這是誰寫的函數的人的責任(即你)編寫預計第一個參數的函數成爲累加器。

正如您提到的MDN文檔所說的那樣,reduce函數將作爲第一個參數傳遞。

在第一次迭代中什麼是蓄能器和電流值

的值作爲文件說,它第一次被調用時,蓄能器將被設置爲initialValue這將是第一要素該數組如果沒有另外指定。同樣,當前值將是當前在數組中處理的值。

,如果我不給初始值會發生什麼(這裏是0)

引用你所引用的文件:如果沒有初始值提供,數組中的第一個元素將使用。

0

好的,我認爲你在概念上缺少一步。在MDN文檔中,您會注意到傳遞給reducer函數的回調函數最多可以接受4個參數(累加器,當前值,當前索引,最初調用數組reduce)。通常你會看到reducer只使用回調函數中的累加器和當前值參數。累加器是以前迭代的累積結果,當前值是Reducer當前正在迭代的索引處的值。

```

// ES6 
const reducer = (accumulator, currentValue) => Math.max(accumulator, currentValue); 

// OR OLDER 
const reducer = function(accumulator, currentValue) { 
    // return whichever is higher 
    return Math.max(accumulator, currentValue); 
} 
const arr = [1,2,3]; 
let result = arr.reduce(reducer, 0); 
// (0, 1) -> (1, 2) -> (2, 3) -> result = 3; 
// more interesting 
const arr_2 = [5, 1, 6, 7, 4, 9, 2, 8]; 
let result_2 = arr_2.reduce(reducer, 0); 
// (0, 5)->(5,1)->(5,6)->(6,7)->(7,4)->(7,9)->(9,2)->(9,8)->result = 9 

減速器回調是執行基於累積值和當前數組索引的評價,然後返回結果的比較器功能。

array.prototype.reduce使用這個回調函數和一個可選的基值(在我的例子中爲0)來將數組內容減少到一個值。

例如,如果你想在數組中添加的所有號碼,你會:

const arr = [1,2,3]; 
let result = arr.reduce((acc, cur) => cur + acc, 0); 
// (0, 1) -> (1, 2) -> (3, 3) -> result = 6