如何在Coffeescript中实现array.any()
和array.all()
方法?如何在Coffeescript中实现array.any()和array.all()方法?
11
A
回答
17
这些实际上是Javascript 1.6的一部分,并且在CoffeeScript中的工作方式也是如此。你想要some和every。
我不知道你在什么环境,但IE < 9似乎不支持这些方法。他们很容易添加。这些页面上有一段代码显示了兼容性代码,如果您想要,您可以将它们转换为CoffeeScript,但您需要don't have to。
甲较粗略的,更简单的方法将是(未测试):
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
但无论是那些具有短的电路逻辑。 编辑:但请参阅里卡多的更好版本的答案。
5
退房underscore.js,它为您提供了_.any
和_.all
方法(又名_.some
和_.every
)将在任何重大JS环境中运行。这里是他们如何在CoffeeScript中实施了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
(这取决于_.each
,这是一个简单的迭代法,并_.breakLoop
,这只是抛出一个异常)
12
短路(优化)版本:
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
运行。
0
我一直在寻找这个今天在和决定实施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)
我做all
这种方式,因为我发现它是可读的。另外,我只是做了一个自由浮动函数而不是数组方法。
相关问题
- 1. 如何在coffeescript中实现`with`?
- 2. coffeeScript在html中的实现
- 3. Coffeescript类,方法和实例变量
- 4. CoffeeScript,实现'implements'
- 5. CoffeeScript的实例方法
- 6. 如何在WPF中实现System.currentTimeMillis()方法?
- 7. 如何在XStream中实现omitType方法?
- 8. 如何在IBAction中实现NSArray方法?
- 9. 如何在SailsJS中实现beforeDestroy方法?
- 10. 如何在TypeScript中实现clone()方法?
- 11. 如何在c#中实现Array.ConvertAll方法
- 12. 如何在android中实现notifysetDatachanged方法?
- 13. 如何在FBFriendPickerView中实现didSelectRow方法
- 14. 如何在Nativescript中实现Java方法?
- 15. 如何在VB.NET中实现GetStableHash方法
- 16. 如何在SherlockFragment中实现onCreateOptionsMenu方法?
- 17. 如何实现hashCode和equals方法
- 18. 如何在Sinatra和Sequel中实现Active Record,如'find'方法?
- 19. 如何在实现接口的类中实现静态方法?
- 20. 如何实现自方法
- 21. 如何实现readinto()方法
- 22. 如何实现IDispatch方法?
- 23. 如何实现GestureListener.onFling()方法
- 24. 如何实现containsAll方法
- 25. 如何实现MIPS方法
- 26. 如何实现方法isMyDeviceATablet()?
- 27. 如何实现can()方法?
- 28. 如何实现ICollection.CopyTo方法?
- 29. 如何实现onShowCustomView方法?
- 30. 继承在CoffeeScript中的实现
完美答案。我只是补充说,可以使用underscore.js与旧版浏览器兼容,如下面的答案所述。 – brandizzi
很容易添加短路,你忘了'?=',看到我的回答:) –
@Ricardo - 是的,那样更好。此外,我不知道?=诡计,所以这非常整齐。 – 2011-08-24 16:49:30