如何在Coffeescript中实现array.any()和array.all()方法?
如何在Coffeescript中实现如何在Coffeescript中实现array.any()和array.all()方法?,coffeescript,Coffeescript,如何在Coffeescript中实现array.any()和array.all()方法?这些方法实际上是Coffeescript的一部分,在Coffeescript中的作用相同。你想要和 我不知道您所处的环境,但IE在@when f(x) Array.prototype.some ?= (f) -> (return true if f x) for x in @ return false Array.prototype.every ?= (f) -> (return f
array.any()
和array.all()
方法?这些方法实际上是Coffeescript的一部分,在Coffeescript中的作用相同。你想要和
我不知道您所处的环境,但IE<9似乎不支持这些方法。它们很容易添加。这些页面上有一段代码向您展示了兼容性代码,如果您愿意,您可以将其转换为CoffeeScript,尽管您可以这样做
更粗糙、更简单的方法是(未经测试):
但它们都没有短路逻辑编辑:但是查看Ricardo的答案可以获得更好的版本。检查,它为您提供了在任何主要JS环境中运行的.any
和.all
方法(也称.some
和.each
)。以下是如何在中的CoffeeScript中实现它们:
(这取决于.each
,这是一种简单的迭代方法,以及.breakLoop
,它只是抛出一个异常。)短路(优化)版本:
Array.prototype.some ?= (f) ->
(return true if f x) for x in @
return false
Array.prototype.every ?= (f) ->
(return false if not f x) for x in @
return true
?=
用于“存在赋值”,仅当该属性为null
/未定义时才会运行我今天看到了这一点,决定将all
作为一个折叠来实现,我想您也可以对任何执行相同的操作(但它也不会短路):
非短路any
基本相似:
reduceAny = (left, right) ->
return left or right
[p(elem) for elem in someArray].reduce(reduceAny, false)
我这样做是因为我发现它是可读的。此外,我只是将其作为一个自由浮动函数而不是数组方法来执行。完美答案。我要补充的是,可以使用下划线.js与旧浏览器兼容,如下面的答案所示。添加短路很容易,而且您忘记了?=
,请参阅我的答案:)@Ricardo-是的,这样更好。另外,我不知道?=技巧,所以这很简单。完善上面的:Array.prototype.some?=(f)->在@when f(x)
Array.prototype.some ?= (f) ->
(return true if f x) for x in @
return false
Array.prototype.every ?= (f) ->
(return false if not f x) for x in @
return true
all = (someArray, predicate) ->
reduceAll = (left, right) ->
return left and right
return [predicate(elem) for elem in someArray].reduce(reduceAll, true)
reduceAny = (left, right) ->
return left or right
[p(elem) for elem in someArray].reduce(reduceAny, false)