我希望将传递到我的数组reduce()函数的函数抽象化,使该函数成为通用的“数组最大值约简器”。为了实现这一点,我想在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
都会返回一个全新的函数,该函数接受两个球员并返回满足条件的那个球员。通过这种方式创建的函数与直接定义的函数完全相同,因此您可以将其传递到reduce
等函数中。如果您想更深入地了解它,请尝试对topPlayerReducer
进行一些调整:在命令行/控制台中调用var foo = topPlayerReducer(someFunc)
。然后,您可以查看foo
是什么,尝试使用一些参数调用它等。 - Peter