Coffeescript'te array.any()
ve array.all()
yöntemleri nasıl uygulanır?Coffeescript'te array.any() ve array.all() yöntemleri nasıl uygulanır?
cevap
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
kontrol. İşte underscore.coffee yılında CoffeeScript uygulanan konum edebilirsiniz:
(-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
?=
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.
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
Kısa devre eklemek kolaydır ve 'unuttum' = ', cevabımı görün :) –
@Ricardo - Evet, bu daha iyi. Ayrıca, ben bilmiyordum? = Hile, bu yüzden oldukça temiz. –