2011-08-23 13 views

答えて

17

これらは実際にJavascript 1.6の一部であり、CoffeeScriptではまったく同じように動作します。 someeveryが必要です。

私はどのような環境にいるのかわかりませんが、IE < 9はこれらの方法をサポートしていないようです。彼らはかなり簡単に追加することができます。これらのページには、互換コードを示すコードスニペットがあります。必要ならば、don't have toでも、それらをCoffeeScriptに翻訳できます。

cruder、簡単な方法は、(未テスト)のようになります。

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

@Ricardo - そうですね。また、私は知りませんでしたか?=トリックなので、きれいです。 –

5

すべての主要なJS環境で実行されます_.any_.all方法(別称、_.some_.every)をご提供する、underscore.jsをチェックしてください。ここではそれらが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 

(これらは単に例外をスロー単純な反復法、および_.breakLoop、である、_.eachによって異なります。)

12

で短絡(最適化)のバージョン:そのプロパティがnull/undefinedとき

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 

?=は "実存の割り当て" のために、のみ実行されます。

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をした私はそれが読めることが判明しているため。また、私はちょうど配列メソッドの代わりにフリーフローティング関数としてそれをやった。

関連する問題