我想抽象传递给我的数组'reduce()
函数的函数,使函数成为通用的'最大的Array 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);
}
答案 0 :(得分:5)
我会这样做:
更改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
寻找的东西叫做部分应用程序,你可以使用多个参数来获取函数,提供一些但不是所有的参数,以及找回一个期望剩余参数的函数。
您可以使用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
版本只是在这种情况下增加了混乱。但是,当您拥有使用bind
的函数时,this
会非常有用,并且您需要一种方法来更改其值。