簡體   English   中英

高階reduce()函數

[英]Higher-order reduce() function

我想抽象傳遞到我的數組的reduce()函數中的函數,使該函數成為通用的“數組reducer 中最偉大的”。 為了實現這一點,我想在reduce()參數中傳入不同的特定函數,以便能夠指定比較標准。 在我的例子中,這些是線

return players.reduce(topPlayerReducer, players[0], getThreePointerPercentage);

return players.reduce(topPlayerReducer, players[0], getReboundNumber);

其中topPlayerReducer是傳遞給reduce()的通用函數,它根據某些條件查找數組中最大的項。 我的標准是第三個參數。 如何合並我的特定比較函數( getThreePointerPercentagegetReboundNumber ),以便保持這種抽象級別? 現在,我收到的錯誤是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做到這一點,但你必須記住:

  1. 該 bind 需要一個額外的參數,該參數在函數內綁定到this
  2. 您“預加載”的參數將從左側填充。

因此,如果您進行了這些更改,那么您嘗試使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM