2011-08-23 23 views

Trả lời

17

Đó 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 someevery.

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ọ.

+0

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

+0

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 :) –

+0

@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. –

5

Check-out underscore.js, mà cung cấp cho bạn với _.any_.all phương pháp (còn gọi là _.some_.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ệ)

12

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.

0

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.

Các vấn đề liên quan