Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Coffeescript中实现array.any()和array.all()方法?_Coffeescript - Fatal编程技术网

如何在Coffeescript中实现array.any()和array.all()方法?

如何在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

如何在Coffeescript中实现
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)