2015-07-13 84 views
1

在研究reduce方法時,我不太清楚爲什麼傳入的回調需要第三個和第四個參數,索引和數組。在從MDN的例子:爲什麼reduce的回調函數有四個參數?

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) { 
    return previousValue + currentValue; 
}); 

一種用於陣列很多其他用途的降低方法或下劃線減少功能我只研究利用前兩個參數爲callbackpreviousValue(有時被視爲accumulator )和currentValue(又名elem,當前索引的值)。

爲什麼減少有時用callback寫四個參數,有時只寫previousValuecurrentValue

如果需要參數indexarray,會出現什麼情況?

如果應用reduce需要第三個或第四個參數,是否應該在函數定義中始終給出所有四個參數以減少?

+1

不需要總是給出所有4個參數,你可以使用前2個參數,如'function(previousValue,currentValue){}'... –

回答

2

這裏是一個(略)做作以下示例來總結唯一值在陣列中,跳過重複,使用索引陣列參數找到唯一值:

[0, 1, 2, 3, 2, 1, 0].reduce(function(previousValue, currentValue, index, array) { 
    return array.indexOf(currentValue) === index ? // value used already? 
     previousValue + currentValue : // not used yet, add to sum 
     previousValue; // used already, skip currentValue 
}); // == 6 (0+1+2+3) 

現場演示:http://pagedemos.com/fn764n659ama/1/

邊注:[]。降低()運行通過指定回調所有四個參數形式參數,不管它們是由函數內部的代碼中使用的V8引擎相當快一點。

1

如果您只需要使用前兩個參數,將最後兩個參數保留在函數參數列表中是完全正確的。在這種情況下,最後兩個參數將被忽略。綜上所述數組,這是做它完全可以接受的:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue) { 
    return previousValue + currentValue; 
}); 

最後兩個參數,indexarray只是給你額外的信息的情況下,你需要它。例如,假設你想總結陣列乘以其反射鏡器件中的所有元素,即給定數組[0, 1, 2, 3, 4]你想輸出

(0 * 4) + (1 * 3) + (2 * 2) + (3 * 1) + (4 * 0) 

,那麼你將不得不使用最後兩個參數:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) { 
    return previousValue + currentValue * array[array.length - index - 1]; 
}); 

誠然,這是一個有些人爲的例子,但我有一個很難想出似乎不做作的一個例子。無論如何,最後兩個參數偶爾派上用場。

相關問題