- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想抽象化传递到我的数组的 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);
}
最佳答案
我会这样做:
更改 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
的函数时很有用,但是您需要一种方法来更改它的值。
关于javascript - 高阶 reduce() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564346/
我正在使用缺少 findall 的高阶 Prolog 变体. 还有一个关于实现我们自己的问题 findall这里:Getting list of solutions in Prolog . 低效的实现
我正在尝试使用 Flow 类型创建高阶组件,但在处理返回的组件类型时遇到了问题。 最小的例子: /* @flow */ import React from 'react'; type Props =
我想抽象化传递到我的数组的 reduce() 函数中的函数,使该函数成为通用的“最强大的 Array reducer”。为此,我想在 reduce() 参数中传入不同的特定函数,以便能够指定比较标准。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
将宏名称作为其他宏的参数来模拟高阶函数是否“安全”? 即我应该注意哪里才不会搬起石头砸自己的脚? 以下是一些片段: #define foreach_even(ii, instr) for(int ii
谁能给我解释一下下面的代码是怎么回事。该函数正在接收 n 作为参数,那么 m 来自哪里?整个代码令人困惑。如果有人可以解释一下? function greaterThan(n) { retur
我有一个 list ,例如: ["Hello", "Goodbye"] 我想使用 map在名单上; 我已经成功使用 map前: f = ("example" ++) 那么: map f ["Hello
我正在尝试通过在线书籍“Learn you a Haskell”来学习一些 Haskell,并且我有一个关于高阶函数的问题。 我看到了some examples我想做一些更高级的功能,但我不知道为什么
我正在学习更深入的 redux,并且在处理高阶 reducer 时遇到一些麻烦。 我试图使用一个简单的分页示例来了解它是如何工作的。 NB:下面的代码只是 Nodejs 上下文中 redux 的一个快
高阶函数是什么呢? 高阶函数英文名叫:Higher Order function ,一个函数可以接收一个或多个函数作为输入,或者输出一个函数,至少满足上述条件之一的函数,叫做高阶函数。 前言
我写了一个小的 R 代码片段来遍历包含马尔可夫链实现的向量,并返回观察到的给定顺序的转换。具体而言,假设我们对状态空间 $\mathcal{S}$ 的 2 次转换感兴趣。最终目标是以方便的形式存储计数
如您所见,我很难表达标题中的问题。 我有一个包含 li 的 ul,它本身包含一个 ul 和它自己的 li。 我希望仅第一个 li 元素而不是第二个 ul 中的元素。 如果你看this fiddle (
我是一名优秀的程序员,十分优秀!