[英]Higher-order reduce() function
我想抽象傳遞到我的數組的reduce()
函數中的函數,使該函數成為通用的“數組reducer 中最偉大的”。 為了實現這一點,我想在reduce()
參數中傳入不同的特定函數,以便能夠指定比較標准。 在我的例子中,這些是線
return players.reduce(topPlayerReducer, players[0], getThreePointerPercentage);
和
return players.reduce(topPlayerReducer, players[0], getReboundNumber);
其中topPlayerReducer
是傳遞給reduce()
的通用函數,它根據某些條件查找數組中最大的項。 我的標准是第三個參數。 如何合並我的特定比較函數( getThreePointerPercentage
和getReboundNumber
),以便保持這種抽象級別? 現在,我收到的錯誤是fn
不是topPlayerReducer
的函數。 我對此並不感到驚訝,因為我的其他功能不在范圍內。 我也試過做
var reboundReducer = topPlayerReducer.bind(getReboundNumber);
return gameInfo.players.reduce(reboundReducer, players[0]);}
但我遇到了同樣的錯誤。
我意識到我可以通過為reduce()
制作兩個不同的函數來實現結果,但這並不能滿足我。 我想知道是否有辦法以不同的方式做到這一點。
function getGuardWithMostThreePointers(gameInfo){
return players.reduce(topPlayerReducer, players[0], getThreePointerPercentage);
}
function getPlayerWithMostRebounds(gameInfo){
return players.reduce(topPlayerReducer, players[0], getReboundNumber);
}
function topPlayerReducer(topPlayer, currentPlayer, fn){
if (fn(currentPlayer) > fn(topPlayer)){
return currentPlayer;
} else {
return topRebounder;
}
}
function getReboundNumber(player){
return parseInt(player.rebounds_offensive) + parseInt(player.rebounds_defensive);
}
function getThreePointerPercentage(player){
return parseInt(player.three_pointers_made) / parseInt(player.three_pointers_attempted);
}
我會這樣做:
更改topPlayerReducer
的實現,使其返回一個比較兩個玩家的函數,而不是比較玩家本身:
function topPlayerReducer(fn){
return function(topPlayer, currentPlayer) {
if (fn(currentPlayer) > fn(topPlayer)){
return currentPlayer;
} else {
return topPlayer;
}
}
}
然后你可以像這樣調用reduce
:
return pointGuards.reduce(topPlayerReducer(getThreePointerPercentage), pointGuards[0]);
或者
return gameInfo.players.reduce(topPlayerReducer(getReboundNumber), gameInfo.players[0]);
通過這種方式,您可以在每次不同的調用中傳遞一個自定義函數來reduce
,您只需首先在topPlayerReducer
“包裝”它。 我認為這就是您試圖通過bind
實現的目標。
僅供參考:我認為您從bind
中尋找的是稱為partial application 的東西,您可以在其中獲取具有多個參數的函數,提供一些但不是全部參數,並返回一個需要剩余參數的函數。 你可以用bind
做到這一點,但你必須記住:
this
,因此,如果您進行了這些更改,那么您嘗試使用 bind 就會成功:
// Make fn the leftmost parameter
function topPlayerReducer(fn, topPlayer, currentPlayer){
if (fn(currentPlayer) > fn(topPlayer)){
return currentPlayer;
} else {
return topRebounder;
}
}
// Add an extra 'null' argument to be bound to the `this` variable
return players.reduce(topPlayerReducer.bind(null, getReboundNumber), players[0])
對於我的錢, bind
版本在這種情況下只會增加混亂。 但是,當您有使用this
函數時, bind
會很有用,並且您需要一種方法來更改其值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.