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

发布于 2024-11-30 16:03:51 字数 57 浏览 0 评论 0原文

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

How to implement array.any() and array.all() methods in Coffeescript?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

樱花落人离去 2024-12-07 16:03:51

这些实际上是 Javascript 1.6 的一部分,并且在 CoffeeScript 中的工作方式相同。您需要 some

不知道你是什么环境,但是IE< 9 似乎不支持这些方法。它们很容易添加。这些页面上有一段代码向您显示兼容性代码,如果您愿意,您可以将它们转换为 CoffeeScript,尽管您 不必

一种更粗略、更简单的方法是(未经测试):

if not Array.prototype.some
    Array.prototype.some = (f) -> (x for x in @ when f(x)).length > 0

if not Array.prototype.every
    Array.prototype.every = (f) -> (x for x in @ when f(x)).length == @length

但这两种方法都没有短路逻辑。 编辑:但请参阅里卡多的答案以获得更好的版本。

Those are actually part of Javascript 1.6 and will work just the same in CoffeeScript. You want some and every.

I don't know what environment you're in, but IE < 9 doesn't seem to support those methods. They're pretty easy to add. There's a snippet of code on those pages that show you compatibility code and if you want you can translate them to CoffeeScript, though you don't have to.

A cruder, simpler way would be (untested):

if not Array.prototype.some
    Array.prototype.some = (f) -> (x for x in @ when f(x)).length > 0

if not Array.prototype.every
    Array.prototype.every = (f) -> (x for x in @ when f(x)).length == @length

But neither of those have short circuit logic. Edit: But see Ricardo's answer for a better version of them.

∝单色的世界 2024-12-07 16:03:51

短路(优化)版本:

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/undefined 时运行。

Short-circuited (optimized) versions:

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

The ?= is for "existential assignment", only runs when that property is null/undefined.

溺ぐ爱和你が 2024-12-07 16:03:51

查看 underscore.js,它为您提供了 _.any 和 < code>_.all 方法(又名 _.some_.every)将在任何主要 JS 环境中运行。以下是它们在 underscore.coffee 中的 CoffeeScript 中的实现方式:

_.some = (obj, iterator, context) ->
  iterator ||= _.identity
  return obj.some iterator, context if nativeSome and obj.some is nativeSome
  result = false
  _.each obj, (value, index, list) ->
    _.breakLoop() if (result = iterator.call(context, value, index, list))
  result

_.every = (obj, iterator, context) ->
  iterator ||= _.identity
  return obj.every iterator, context if nativeEvery and obj.every is nativeEvery
  result = true
  _.each obj, (value, index, list) ->
    _.breakLoop() unless (result = result and iterator.call(context, value, index, list))
  result

(这些依赖于 _.each,这是一种简单的迭代方法,以及 _.breakLoop,它只是抛出异常。)

Check out underscore.js, which provides you with _.any and _.all methods (a.k.a. _.some and _.every) that will run in any major JS environment. Here's how they're implemented in CoffeeScript in underscore.coffee:

_.some = (obj, iterator, context) ->
  iterator ||= _.identity
  return obj.some iterator, context if nativeSome and obj.some is nativeSome
  result = false
  _.each obj, (value, index, list) ->
    _.breakLoop() if (result = iterator.call(context, value, index, list))
  result

_.every = (obj, iterator, context) ->
  iterator ||= _.identity
  return obj.every iterator, context if nativeEvery and obj.every is nativeEvery
  result = true
  _.each obj, (value, index, list) ->
    _.breakLoop() unless (result = result and iterator.call(context, value, index, list))
  result

(These depend on _.each, which is a straightforward iteration method, and _.breakLoop, which just throws an exception.)

笑脸一如从前 2024-12-07 16:03:51

我今天正在研究这个,并决定将 all 实现为折叠,我想您也可以对 any 执行相同的操作(但它不会短路,要么):

all = (someArray, predicate) ->
  reduceAll = (left, right) ->
    return left and right
  return [predicate(elem) for elem in someArray].reduce(reduceAll, true)

非短路 any 大多相似:

reduceAny = (left, right) ->
    return left or right
[p(elem) for elem in someArray].reduce(reduceAny, false)

我这样做是因为我发现它是可读的。另外,我只是将其作为自由浮动函数而不是数组方法来实现。

I was looking at this today and decided to implement all as a fold, and I suppose you could do the same for any as well (but it doesn't short circuit, either):

all = (someArray, predicate) ->
  reduceAll = (left, right) ->
    return left and right
  return [predicate(elem) for elem in someArray].reduce(reduceAll, true)

The non-short-circuiting any would be mostly similar:

reduceAny = (left, right) ->
    return left or right
[p(elem) for elem in someArray].reduce(reduceAny, false)

I did all this way because I found it to be readable. Also, I just did it as a free-floating function instead of an array method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文