Làm cách nào để triển khai các phương thức array.any()
và array.all()
trong Coffeescript?Làm thế nào để thực hiện các phương thức array.any() và array.all() trong Coffeescript?
Trả lời
Đó thực sự là một phần của Javascript 1.6 và sẽ hoạt động bình thường trong CoffeeScript. Bạn muốn some và every.
Tôi không biết bạn đang ở trong môi trường nào, nhưng IE < 9 dường như không hỗ trợ các phương pháp đó. Chúng khá dễ dàng để thêm vào. Có một đoạn mã trên các trang hiển thị cho bạn mã tương thích và nếu bạn muốn bạn có thể dịch chúng sang CoffeeScript, mặc dù bạn don't have to.
Một cách đơn giản hơn cruder sẽ là (chưa được kiểm tra):
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
Nhưng không ai trong số những người có logic ngắn mạch. Chỉnh sửa: Nhưng hãy xem câu trả lời của Ricardo để có phiên bản tốt hơn cho họ.
Check-out underscore.js, mà cung cấp cho bạn với _.any
và _.all
phương pháp (còn gọi là _.some
và _.every
) mà sẽ chạy trong bất kỳ môi trường JS lớn. Đây là cách mà họ đang thực hiện trong CoffeeScript trong 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
(. Những phụ thuộc vào _.each
, mà là một phương pháp đơn giản lặp đi lặp lại, và _.breakLoop
, mà chỉ ném một ngoại lệ)
ngắn mạch (tối ưu hóa) phiên bản:
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
Các ?=
là dành cho "nhiệm vụ hiện sinh", chỉ chạy khi tài sản đó là null
/undefined
.
Tôi đã nhìn vào ngày hôm nay và quyết định để thực hiện all
như một lần, và tôi cho rằng bạn có thể làm tương tự cho any
cũng như (nhưng nó không ngắn mạch, một trong hai):
all = (someArray, predicate) ->
reduceAll = (left, right) ->
return left and right
return [predicate(elem) for elem in someArray].reduce(reduceAll, true)
các phi chập mạch any
sẽ chủ yếu tương tự:
reduceAny = (left, right) ->
return left or right
[p(elem) for elem in someArray].reduce(reduceAny, false)
tôi đã làm all
cách này bởi vì tôi thấy nó có thể đọc được. Ngoài ra, tôi chỉ làm nó như một hàm thả nổi tự do thay vì một phương thức mảng.
- 1. Làm thế nào để thực hiện phương thức equals() và hashcode() trong BaseEntity của JPA?
- 2. Làm thế nào để bạn thực hiện các phương thức compareTo một cách rõ ràng?
- 3. Cú pháp gọi phương thức trong CoffeeScript
- 4. Làm thế nào để thực hiện các lệnh để sử dụng các phương thức tổ tiên trong WPF?
- 5. Làm thế nào để thực hiện phương thức update() trong DAO bằng EntityManager (JPA)?
- 6. Làm thế nào để có được MethodInfo của phương thức giao diện, khi thực hiện MethodInfo của phương thức lớp?
- 7. Làm thế nào để phát hiện quá tải phương thức trong các lớp con trong python?
- 8. Làm thế nào để bỏ qua việc thực hiện một phương thức cha mẹ để thực hiện phương thức ông bà?
- 9. CoffeeScript, triển khai 'thực hiện'
- 10. Làm thế nào tôi có thể buộc các lớp kế thừa để thực hiện một phương thức tĩnh trong C#?
- 11. Làm thế nào để thực hiện nhiều cuộc gọi đến các phương thức lớp trong cùng một dòng?
- 12. Làm cách nào để in các truy vấn được thực hiện bởi phương thức django .save()?
- 13. Làm thế nào để bảo mật các phương thức trong java (tràn và vv)
- 14. Làm thế nào để tự động thay thế một phương thức triển khai thực hiện trong ObjC2?
- 15. Làm thế nào để thực hiện các biểu thức lambda đa dòng trong f #?
- 16. làm thế nào để thực hiện các phương pháp trong beanshell?
- 17. Relaycommand và phương thức thực hiện không tham số
- 18. Làm cách nào để ẩn các phương thức trong F #?
- 19. Làm thế nào để ép buộc các lớp trừu tượng của trẻ thực hiện một phương thức tĩnh?
- 20. Làm thế nào để thực hiện một lớp lồng nhau PHP hoặc các phương thức lồng nhau?
- 21. Tìm thời gian thực hiện Phương thức
- 22. Làm thế nào để bạn tổ chức các phương thức và thuộc tính trong một lớp?
- 23. làm thế nào để thực hiện onRetainNonConfigurationInstance
- 24. Làm thế nào để chuyển các biến vào các phương thức khe trong QT?
- 25. Dừng thực hiện phương thức getCurrentPosition
- 26. Cách thực hiện chức năng gọi lại trong Coffeescript
- 27. Làm thế nào để JVM và Java thực hiện việc đọc và ghi vào các tệp?
- 28. Làm cách nào để đơn vị kiểm tra các phương thức trong đối tượng phương thức?
- 29. Làm thế nào để thực hiện phương thức giao diện với kiểu trả về là một giao diện trong Golang
- 30. Khi nào/tại sao/làm thế nào để sử dụng các phương thức thể hiện giao thức UINavigationControllerDelegate?
Câu trả lời hoàn hảo. Tôi chỉ muốn thêm rằng người ta có thể sử dụng underscore.js để tương thích với các trình duyệt cũ hơn, như câu trả lời dưới đây nói. – brandizzi
Thật dễ dàng để thêm ngắn mạch và bạn quên '? =', Xem câu trả lời của tôi :) –
@Ricardo - Yeah, điều đó tốt hơn. Ngoài ra, tôi không biết? = Lừa, vì vậy đó là khá gọn gàng. –