2011-08-23 11 views

cevap

17

Bunlar aslında Javascript 1.6'un bir parçasıdır ve aynı şekilde CoffeeScript'te çalışacaktır. some ve every'u istiyorsunuz.

Hangi ortamda olduğunuzu bilmiyorum, ancak IE < 9 bu yöntemleri desteklemiyor gibi görünüyor. Eklemek oldukça kolay. Uyumluluk kodunu gösteren bu sayfalarda bir kod snippet'i var ve isterseniz bunları don't have to numaralı telefondan çevirerek CoffeeScript'e çevirebilirsiniz.

bir katı bir anlayışa, daha basit bir yolu (denenmemiş) olacaktır:

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 

Fakat bunlardan hiçbiri kısa devre mantığı var. Düzenle: Ama Ricardo'nun daha iyi bir sürümü için cevabını görün. herhangi bir büyük JS ortamında çalışır _.any ve _.all yöntemlerle (nam-ı diğer _.some ve _.every) sağlar dışarı underscore.js

+0

Mükemmel cevap. Aşağıdaki yanıtın dediği gibi, eski tarayıcılarla uyumluluk için underscore.js'yi kullanabileceğini eklemeliyim. – brandizzi

+0

Kısa devre eklemek kolaydır ve 'unuttum' = ', cevabımı görün :) –

+0

@Ricardo - Evet, bu daha iyi. Ayrıca, ben bilmiyordum? = Hile, bu yüzden oldukça temiz. –

5

kontrol. İşte underscore.coffee yılında CoffeeScript uygulanan konum edebilirsiniz:

12

(-Kısa devre optimize

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

(Bunlar sadece bir istisna atar basit iterasyon yöntemi ve _.breakLoop, hangi _.each bağlıdır.)) sürümleri: bu özellik null/undefined olduğunda

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 

?=

"varoluşsal atama" için, sadece çalışır.

0

Bugün buna bakarak ve bir kat olarak all uygulamaya karar ve senin de any için aynı yapabilirdi (ama ya kısa devre yapar değil) varsayalım:

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

olmayan kısa devre any çoğunlukla benzer olacaktır:

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

Ben bu şekilde all yaptım okunabilir olduğu tespit çünkü. Ayrıca, bunu bir dizi yöntemi yerine serbest kayan bir işlev olarak yaptım.

İlgili konular