2011-08-23 8 views

उत्तर

17

वे वास्तव में Javascript 1.6 का हिस्सा हैं और कॉफीस्क्रिप्ट में भी वही काम करेंगे। आप some और every चाहते हैं।

मुझे नहीं पता कि आप किस पर्यावरण में हैं, लेकिन आईई < 9 उन तरीकों का समर्थन नहीं करता है। वे जोड़ने के लिए बहुत आसान हैं। उन पृष्ठों पर कोड का एक स्निपेट है जो आपको संगतता कोड दिखाता है और यदि आप चाहते हैं कि आप उन्हें कॉफीस्क्रिप्ट में अनुवाद कर सकें, हालांकि आप don't have to हैं।

एक cruder, सरल तरीके से (untested) होगा:

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 

लेकिन उन में से कोई भी शॉर्ट सर्किट तर्क है। संपादित करें: लेकिन रिकार्डो के उनके बेहतर संस्करण के लिए उत्तर देखें।

+0

बिल्कुल सही जवाब। मैं बस जोड़ता हूं कि पुराने ब्राउज़र के साथ संगतता के लिए underscore.js का उपयोग कर सकते हैं, जैसा कि नीचे दिया गया जवाब कहता है। – brandizzi

+0

शॉर्ट सर्किटिंग जोड़ना आसान है, और आप '? =' भूल गए हैं, मेरा जवाब देखें :) –

+0

@ रिकार्डो - हाँ, यह बेहतर है। इसके अलावा, मुझे नहीं पता था? = चाल, तो यह बहुत साफ है। –

5

चेक बाहर underscore.js, जो आप _.any और _.all तरीकों (यानी _.some और _.every) है कि किसी भी प्रमुख जे एस वातावरण में चलेंगे साथ प्रदान करता है। यहाँ कैसे वे underscore.coffee में CoffeeScript में लागू कर रहे हैं:

_.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 इस तरह से किया क्योंकि मैंने पाया यह पठनीय होने के लिए। इसके अलावा, मैंने इसे एक सरणी विधि के बजाय एक फ्री-फ़्लोटिंग फ़ंक्शन के रूप में किया है।

संबंधित मुद्दे