gpt4 book ai didi

javascript - 高阶 reduce() 函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:00:40 27 4
gpt4 key购买 nike

我想抽象化传递到我的数组的 reduce() 函数中的函数,使该函数成为通用的“最强大的 Array 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 中寻找的是称为部分应用 的东西,您在其中采用具有多个参数的函数,提供一些但不是全部参数,并返回一个需要剩余参数的函数。您可以使用 bind 来完成此操作,但您必须记住:

  1. bind 接受一个额外的参数,该参数绑定(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 版本只会在这种情况下增加困惑。 bind 在您有使用 this 的函数时很有用,但是您需要一种方法来更改它的值。

关于javascript - 高阶 reduce() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com